คำถามติดแท็ก move-semantics

12
ซีแมนทิกส์ย้ายคืออะไร?
ฉันเพิ่งเสร็จสิ้นการฟังวิทยุวิศวกรรมซอฟต์แวร์สัมภาษณ์พอดคาสต์กับสกอตต์เมเยอร์สเกี่ยวกับภาษา C ++ 0x คุณสมบัติใหม่ส่วนใหญ่มีเหตุผลสำหรับฉันและฉันรู้สึกตื่นเต้นจริง ๆ กับ C ++ 0x ตอนนี้ยกเว้นหนึ่งคุณลักษณะ ฉันยังไม่เข้าใจความหมาย ... มันคืออะไรกันแน่?

7
push_back กับ emplace_back
ฉันบิตสับสนเกี่ยวกับความแตกต่างระหว่างและpush_backemplace_back void emplace_back(Type&& _Val); void push_back(const Type& _Val); void push_back(Type&& _Val); เนื่องจากมีการใช้งานpush_backมากเกินไปในการอ้างอิงค่า rvalue ฉันไม่เห็นเลยว่าจุดประสงค์ของการemplace_backเป็นอย่างไร


6
C ++ 11 rvalues ​​และย้ายความสับสนของซีแมนทิกส์ (คำสั่ง return)
ฉันพยายามเข้าใจการอ้างอิงค่าและย้ายซีแมนทิกส์ของ C ++ 11 อะไรคือความแตกต่างระหว่างตัวอย่างเหล่านี้และสิ่งใดที่จะไม่คัดลอกเวกเตอร์ ตัวอย่างแรก std::vector<int> return_vector(void) { std::vector<int> tmp {1,2,3,4,5}; return tmp; } std::vector<int> &&rval_ref = return_vector(); ตัวอย่างที่สอง std::vector<int>&& return_vector(void) { std::vector<int> tmp {1,2,3,4,5}; return std::move(tmp); } std::vector<int> &&rval_ref = return_vector(); ตัวอย่างที่สาม std::vector<int> return_vector(void) { std::vector<int> tmp {1,2,3,4,5}; return std::move(tmp); } std::vector<int> &&rval_ref = return_vector();

3
“ การอ้างอิงค่าสำหรับ * นี้” คืออะไร?
มาข้ามข้อเสนอที่เรียกว่า "การอ้างอิง rvalue สำหรับ * นี้" ในเสียงดังกราวของC ++ หน้า ฉันได้อ่านเกี่ยวกับการอ้างอิงค่าและเข้าใจพวกเขามาบ้าง แต่ฉันไม่คิดว่าฉันจะรู้เรื่องนี้ ฉันไม่สามารถหาแหล่งข้อมูลมากมายบนเว็บโดยใช้คำศัพท์ มีลิงก์ไปยังเอกสารข้อเสนอบนหน้า: N2439 (ขยายความหมายของการย้ายไปเป็น * สิ่งนี้) แต่ฉันก็ไม่ได้รับตัวอย่างมากมายจากที่นั่น คุณสมบัตินี้เกี่ยวกับอะไร?

2
C ++ ที่ทันสมัยช่วยเพิ่มประสิทธิภาพให้คุณได้ฟรีหรือไม่?
บางครั้งมีการอ้างว่า C ++ 11/14 สามารถเพิ่มประสิทธิภาพให้คุณได้แม้เพียงแค่รวบรวมรหัส C ++ 98 การให้เหตุผลมักตามแนวความหมายของการย้ายเนื่องจากในบางกรณีตัวสร้าง rvalue จะถูกสร้างขึ้นโดยอัตโนมัติหรือตอนนี้เป็นส่วนหนึ่งของ STL ตอนนี้ฉันสงสัยว่าก่อนหน้านี้กรณีเหล่านี้ได้รับการจัดการโดย RVO หรือการเพิ่มประสิทธิภาพคอมไพเลอร์ที่คล้ายกันแล้ว คำถามของฉันคือถ้าคุณสามารถให้ตัวอย่างจริงของรหัส C ++ 98 ที่ไม่มีการดัดแปลงให้ทำงานได้เร็วขึ้นโดยใช้คอมไพเลอร์ที่สนับสนุนคุณสมบัติภาษาใหม่ ฉันเข้าใจว่าคอมไพเลอร์ที่ได้มาตรฐานไม่จำเป็นต้องทำการคัดลอกและโดยเหตุผลความหมายของการย้ายอาจทำให้เกิดความเร็ว แต่ฉันต้องการเห็นกรณีทางพยาธิวิทยาน้อยลงถ้าคุณต้องการ แก้ไข: เพื่อให้ชัดเจนฉันไม่ได้ถามว่าคอมไพเลอร์ใหม่นั้นเร็วกว่าคอมไพเลอร์เก่าหรือไม่ แต่ถ้ามีโค้ดที่เพิ่ม -std = c ++ 14 ให้คอมไพเลอร์ของฉันมันจะทำงานเร็วขึ้น (หลีกเลี่ยงการทำสำเนา แต่ถ้าคุณ สามารถเกิดขึ้นกับสิ่งอื่นนอกเหนือจากความหมายย้ายฉันก็มีความสนใจเช่นกัน)

6
ทำไมฉันถึงต้อง std :: ย้าย std :: shared_ptr?
ฉันได้อ่านซอร์สโค้ดของ Clangแล้วและฉันพบข้อมูลโค้ดนี้: void CompilerInstance::setInvocation( std::shared_ptr<CompilerInvocation> Value) { Invocation = std::move(Value); } ทำไมฉันจะต้องการที่จะ?std::movestd::shared_ptr มีจุดใดที่ถ่ายโอนความเป็นเจ้าของในทรัพยากรที่ใช้ร่วมกันหรือไม่ ทำไมฉันจะไม่ทำเช่นนี้แทน? void CompilerInstance::setInvocation( std::shared_ptr<CompilerInvocation> Value) { Invocation = Value; }

2
ฉันจะทำอย่างไรกับวัตถุที่ถูกย้ายจาก?
มาตรฐานกำหนดสิ่งที่ฉันสามารถทำกับวัตถุได้อย่างแม่นยำเมื่อมันถูกย้ายจากหรือไม่? ฉันเคยคิดว่าทุกสิ่งที่คุณสามารถทำได้ด้วยวัตถุที่ย้ายจากไปนั้นทำลายมัน แต่นั่นก็ไม่เพียงพอ ตัวอย่างเช่นใช้เทมเพลตฟังก์ชันswapตามที่กำหนดไว้ในไลบรารีมาตรฐาน: template <typename T> void swap(T& a, T& b) { T c = std::move(a); // line 1 a = std::move(b); // line 2: assignment to moved-from object! b = std::move(c); // line 3: assignment to moved-from object! } เห็นได้ชัดว่ามันจะต้องเป็นไปได้ที่จะกำหนดให้กับการย้ายจากวัตถุมิฉะนั้นบรรทัดที่ 2 และ 3 จะล้มเหลว แล้วฉันจะทำยังไงกับวัตถุที่ถูกย้าย? ฉันจะหารายละเอียดเหล่านี้ได้จากที่ไหน? (อย่างไรก็ตามทำไมมันT c …

6
ฉันจะใช้ deleter ที่กำหนดเองกับสมาชิก std :: unique_ptr ได้อย่างไร
ฉันมีชั้นเรียนที่มีสมาชิก unique_ptr class Foo { private: std::unique_ptr<Bar> bar; ... }; Bar เป็นคลาสของบุคคลที่สามที่มีฟังก์ชัน create () และฟังก์ชัน destroy () หากฉันต้องการใช้ a std::unique_ptrร่วมกับมันในฟังก์ชันสแตนด์อโลนฉันสามารถทำได้: void foo() { std::unique_ptr<Bar, void(*)(Bar*)> bar(create(), [](Bar* b){ destroy(b); }); ... } มีวิธีดำเนินการในstd::unique_ptrฐานะสมาชิกของชั้นเรียนหรือไม่?


4
เมื่อใดที่จะสร้างประเภทที่ไม่สามารถเคลื่อนย้ายได้ใน C ++ 11
ฉันแปลกใจที่สิ่งนี้ไม่ปรากฏในผลการค้นหาของฉันฉันคิดว่ามีคนถามเรื่องนี้มาก่อนเนื่องจากประโยชน์ของความหมายการย้ายใน C ++ 11: เมื่อใดที่ฉันต้อง (หรือเป็นความคิดที่ดีสำหรับฉัน) ทำให้คลาสไม่สามารถเคลื่อนย้ายได้ใน C ++ 11 (เหตุผลอื่นนอกเหนือจากปัญหาความเข้ากันได้กับรหัสที่มีอยู่นั่นคือ)

1
ไม่สามารถย้ายออกจากเนื้อหาที่ยืมมา / ไม่สามารถย้ายออกจากข้อมูลอ้างอิงที่แชร์ได้
cannot move out of borrowed contentฉันไม่เข้าใจข้อผิดพลาด ฉันได้รับมันหลายครั้งและฉันแก้ไขมันมาตลอด แต่ฉันไม่เคยเข้าใจว่าทำไม ตัวอย่างเช่น: for line in self.xslg_file.iter() { self.buffer.clear(); for current_char in line.into_bytes().iter() { self.buffer.push(*current_char as char); } println!("{}", line); } สร้างข้อผิดพลาด: error[E0507]: cannot move out of borrowed content --> src/main.rs:31:33 | 31 | for current_char in line.into_bytes().iter() { | ^^^^ cannot move out …

6
ย้ายตัวดำเนินการกำหนดและ "if (this! = & rhs)"
ในตัวดำเนินการมอบหมายของคลาสคุณมักจะต้องตรวจสอบว่าออบเจ็กต์ที่ถูกกำหนดเป็นอ็อบเจกต์ที่เรียกใช้หรือไม่เพื่อที่คุณจะได้ไม่พลาด: Class& Class::operator=(const Class& rhs) { if (this != &rhs) { // do the assignment } return *this; } คุณต้องการสิ่งเดียวกันสำหรับตัวดำเนินการมอบหมายการย้ายหรือไม่? เคยมีสถานการณ์ที่this == &rhsจะเป็นจริงหรือไม่? ? Class::operator=(Class&& rhs) { ? }

3
ข้อดีของการใช้การอ้างอิงการส่งต่อแบบอิงตามช่วงสำหรับลูปคืออะไร?
const auto&จะเพียงพอถ้าฉันต้องการดำเนินการอ่านอย่างเดียว อย่างไรก็ตามฉันได้ชน for (auto&& e : v) // v is non-const สองสามครั้งเมื่อเร็ว ๆ นี้ สิ่งนี้ทำให้ฉันสงสัย: เป็นไปได้ไหมว่าในบางกรณีมุมที่คลุมเครือมีประโยชน์ด้านประสิทธิภาพในการใช้การอ้างอิงการส่งต่อเมื่อเทียบกับauto&หรือconst auto&? ( shared_ptrเป็นผู้ต้องสงสัยคดีมุมอับ) อัปเดต สองตัวอย่างที่ฉันพบในรายการโปรดของฉัน: ข้อเสียของการใช้การอ้างอิง const เมื่อทำซ้ำในประเภทพื้นฐานหรือไม่? ฉันสามารถทำซ้ำค่าของแผนที่โดยใช้ range-based for loop ได้หรือไม่? โปรดตั้งสมาธิกับคำถาม: เหตุใดฉันจึงต้องการใช้ auto && แบบอิงตามช่วงสำหรับลูป

2
std :: move () โอนค่าไปยัง RValues ​​ได้อย่างไร
ฉันเพิ่งพบว่าตัวเองไม่เข้าใจตรรกะของstd::move(). ตอนแรกฉันใช้ googled แต่ดูเหมือนว่าจะมีเพียงเอกสารเกี่ยวกับวิธีใช้std::move()ไม่ใช่วิธีการทำงานของโครงสร้าง ฉันหมายความว่าฉันรู้ว่าฟังก์ชันสมาชิกเทมเพลตคืออะไร แต่เมื่อฉันดูstd::move()คำจำกัดความใน VS2010 ก็ยังสับสน คำจำกัดความของ std :: move () อยู่ด้านล่าง template<class _Ty> inline typename tr1::_Remove_reference<_Ty>::_Type&& move(_Ty&& _Arg) { // forward _Arg as movable return ((typename tr1::_Remove_reference<_Ty>::_Type&&)_Arg); } สิ่งที่แปลกก่อนสำหรับฉันคือพารามิเตอร์ (_Ty && _Arg) เพราะเมื่อฉันเรียกใช้ฟังก์ชันอย่างที่คุณเห็นด้านล่าง // main() Object obj1; Object obj2 = std::move(obj1); โดยพื้นฐานแล้วมันเท่ากับ // std::move() _Ty&& _Arg = …

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.