tgoop.com/cpp_geek/317
Create:
Last Update:
Last Update:
std::move ничего не двигает 🤯
Вот типичная ошибка, которая встречается даже у опытных:
std::string foo() {
std::string s = "hello";
return std::move(s); // ❌
}
Кажется, что
std::move
здесь «ускоряет» возврат. Но это зло. На самом деле, компилятор и без std::move
применяет Return Value Optimization (RVO) и возвращает s
без копирования. А вот std::move
ломает RVO — теперь вызывается перемещающий конструктор, и компилятор не может это оптимизировать.Результат:
*
return s;
— возможно, вообще без затрат (RVO).*
return std::move(s);
— гарантированно перемещение (дороже, чем RVO).🔑 Правило: никогда не пиши
std::move
при возврате локальной переменной по значению. Доверься компилятору.Когда
std::move
действительно нужен? Например:
void bar(std::string&& s) {
auto local = std::move(s); // перемещаем из rvalue-ссылки
}
Здесь всё логично: мы явно говорим, что хотим «украсть» содержимое.
Вывод:
std::move
— это не перемещение, а обещание, что объект можно обобрать. А перемещать будет уже компилятор.➡️ @cpp_geek
BY C++ geek

Share with your friend now:
tgoop.com/cpp_geek/317