MyTetra Share
Делитесь знаниями!
Move-семантика в языке C++
Время создания: 14.06.2023 11:05
Текстовые метки: C++, Си++, объект, умные, указатели, move, семантика, перемещение
Раздел: Компьютер - Программирование - Язык C++ (Си++) - Стандарт C++11 и выше
Запись: xintrea/mytetra_syncro/master/base/1686729907dx5y4n4e62/text.html на raw.github.com

При работе с умными указателями, рекомендуется использовать следующее правило:


Если объект, имеющий указатель на ресурс, будет уничтожен или не будет более использоваться после выполнения выражения, сам ресурс целесообразнее переместить (move), а не копировать его.


Копирование включает в себя ненужные накладные расходы, такие как выделение памяти, высвобождение и копирование содержимого памяти и т.д.


Для демонстрации вышеуказанного правила, рассмотрим следующую функцию, меняющую местами два значения:


template <class AnyType>

swap(AnyType& a, AnyType& b) {

AnyType tmp(a); // теперь есть две копии a

a = b; // теперь есть две копии b (+ отброшена копия a)

b = tmp; // теперь есть две копии tmp (+ отброшена копия b)

}


Использование move позволяет вам напрямую обменивать ресурсы вместо их копирования:


template <class AnyType>

swap(AnyType& a, AnyType& b) {

AnyType tmp(std::move(a));

a = std::move(b);

b = std::move(tmp);

}


А теперь представьте, что происходит, когда AnyType - это, скажем, vector<int> размера n. И n достаточно велико.


В первой версии вы читаете и записываете 3*n элементов, во второй версии вы, по сути, читаете и записываете только 3 указателя на буферы векторов плюс 3 размера буферов. Конечно, класс AnyType должен знать, как ему перемещаться, т. е. класс должен иметь оператор присваивания перемещением и конструктор перемещения для класса AnyType, чтобы это работало.


Эта фича даст вам значительный прирост в производительности — именно то, почему люди используют C++ (т.е., чтобы выжать последние 2-3 капли скорости).


Так же в этом разделе:
 
MyTetra Share v.0.65
Яндекс индекс цитирования