Move-семантика - это механизм в C++ (начиная с C++11), который позволяет эффективно передавать ресурсы (память, файловые дескрипторы и т.д.) от одного объекта к другому, избегая дорогостоящего глубокого копирования.
class String {
char* data;
size_t size;
public:
// Конструктор перемещения
String(String&& other) noexcept
: data(other.data), size(other.size) {
other.data = nullptr; // Важно: оставляем источник в валидном состоянии
other.size = 0;
}
// Оператор перемещающего присваивания
String& operator=(String&& other) noexcept {
if (this != &other) {
delete[] data; // Освобождаем текущие ресурсы
data = other.data; // Перехватываем ресурсы
size = other.size;
other.data = nullptr;
other.size = 0;
}
return *this;
}
// Деструктор, конструктор копирования и другие методы...
};
String createString() {
String s("Hello");
return s; // Здесь сработает move-семантика (NRVO или явный move)
}
int main() {
String s1("World");
String s2 = std::move(s1); // Явный вызов конструктора перемещения
String s3 = createString(); // Move-семантика при возврате значения
}
noexcept
для оптимальной работы с STLMove-семантика - это мощный механизм C++, позволяющий оптимизировать передачу владения ресурсами между объектами. Она основана на rvalue-ссылках и специальных move-операциях, которые "перехватывают" ресурсы у временных или явно перемещаемых объектов. Правильное использование move-семантики значительно повышает производительность программ, работающих с динамическими ресурсами или тяжелыми объектами.