Avatar ·

ما هي دلالات النقل (move semantics) في C++11 ولماذا هي مطلوبة؟

مرحبًا! لقد بدأت للتو في تعلم C++11 وصادفت مصطلح «move semantics». يبدو أنني أفهم أنه مرتبط بالأداء، لكن عمليًا لا أستطيع فهمه. لنفترض أن لدي الفئة التالية: ```cpp class MyString { public: MyString(const char* str) : data_(new char[strlen(str) + 1]) { strcpy(data_, str); } ~MyString() { delete[] data_; } MyString(const MyString& other) : data_(new char[strlen(other.data_) + 1]) { strcpy(data_, other.data_); } char* data_; }; ``` أكتب دالة تُرجع `MyString`: ```cpp MyString createHello() { MyString s("Hello, World!"); return s; // ماذا يحدث هنا؟ نسخ؟ } ``` باستخدام C++03 القديم، عند العودة من الدالة، كان يتم استدعاء copy constructor الذي يخصص ذاكرة جديدة وينسخ البيانات. هذا مكلف. لكنني سمعت أنه في C++11 يمكن «نقل» البيانات لتجنب النسخ. كيف يعمل هذا؟ ما هي rvalue references و std::move؟ متى يتم استخدامهما؟