tgoop.com/cpp_geek/341
Create:
Last Update:
Last Update:
Move-семантика: где можно ловко сэкономить
Многие знают про std::move
, но не всегда используют его там, где это реально ускоряет код. Простой пример — возврат локального объекта из функции:
#include <string>
std::string make_string() {
std::string s = "Hello";
return s; // RVO или move
}
С C++17 тут почти всегда RVO (Return Value Optimization). Но если RVO невозможен (например, возвращаем тернарный оператор), компилятор применит move:
std::string make_string(bool flag) {
std::string a = "foo", b = "bar";
return flag ? a : b; // тут будет move
}
А вот так можно подсказать компилятору явно:
return std::move(flag ? a : b);
Но осторожно: не делайте
std::move
для локальной переменной в простом return
— это может сломать RVO и привести к лишнему перемещению.Ещё полезно помнить: move не всегда бесплатный. Например, для
std::vector
он копирует указатель и размер, но не элементы. Для std::string
— зависит от Small String Optimization: короткие строки перемещаются как копия.Вывод: используйте
std::move
там, где явно хотите отдать объект, а не копировать. Но не злоупотребляйте им: компилятор с C++17 сам неплохо справляется.➡️ @cpp_geek
BY C++ geek
Share with your friend now:
tgoop.com/cpp_geek/341