|
|||||||
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 капли скорости). |
|||||||
Так же в этом разделе:
|
|||||||
|
|||||||
|