ما هي دلالات النقل (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؟ متى يتم استخدامهما؟