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
