Перейти к содержимому

Перемещающий конструктор

Введение

Перемещающий конструктор в C++ используется для переноса ресурсов (например, динамически выделенной памяти) от одного объекта к другому. Это повышает производительность, избегая ненужного копирования данных.

Определение и назначение

Определение

Перемещающий конструктор принимается rvalue-ссылкой на объект того же типа и перемещает ресурсы от источника к новому объекту.

Синтаксис

class MyClass {
public:
MyClass(MyClass&& other) noexcept;
};

Пример использования

#include <iostream>
#include <utility>
class MyClass {
private:
int* data;
public:
// Конструктор
MyClass(size_t size) : data(new int[size]) {
std::cout << "Constructor" << std::endl;
}
// Деструктор
~MyClass() {
delete[] data;
std::cout << "Destructor" << std::endl;
}
// Перемещающий конструктор
MyClass(MyClass&& other) noexcept : data(other.data) {
other.data = nullptr;
std::cout << "Move Constructor" << std::endl;
}
// Перемещающее присваивание
MyClass& operator=(MyClass&& other) noexcept {
if (this != &other) {
delete[] data;
data = other.data;
other.data = nullptr;
}
std::cout << "Move Assignment" << std::endl;
return *this;
}
};
int main() {
MyClass obj1(10);
MyClass obj2 = std::move(obj1); // вызов перемещающего конструктора
MyClass obj3(20);
obj3 = std::move(obj2); // вызов перемещающего присваивания
}

В этом примере перемещающий конструктор и перемещающее присваивание перенаправляют указатель на данные от исходного объекта к новому, избегая копирования данных.

Преимущества использования перемещающих конструкторов

  • Производительность: Перемещение ресурсов значительно быстрее, чем копирование, особенно для объектов с динамически выделенными ресурсами.
  • Эффективное использование ресурсов: Уменьшается количество операций выделения и освобождения памяти.

Когда использовать перемещающий конструктор

  • Когда объект владеет ресурсом, который можно передать (например, указатели на динамическую память, файловые дескрипторы и т.д.).
  • Когда нужно избежать дорогостоящего копирования больших объектов.

Сравнение с копирующими конструкторами

  • Копирующий конструктор: создает новый объект как копию существующего, копируя все ресурсы.
  • Перемещающий конструктор: передает ресурсы от одного объекта к другому, делая исходный объект безопасным для уничтожения.

Резюме

  • Перемещающий конструктор позволяет эффективно передавать ресурсы от одного объекта к другому.
  • Он повышает производительность, избегая ненужного копирования данных.
  • Использование перемещающих конструкторов и операторов присваивания рекомендуется для объектов с динамически выделенными ресурсами.