Telegram Group & Telegram Channel
Почему std::move может не сработать, как ты ожидал

Всё просто? Хочешь передать объект по move — вызываешь std::move(obj) и думаешь, что теперь точно будет перемещение. Но не всё так однозначно.


void foo(std::string s) {
std::string local = std::move(s);
}


Выглядит, будто s перемещается в local. Но на практике — нет. Здесь копирование. Почему?

s — это lvalue, несмотря на std::move в правой части. А значит, выбирается std::string конструктор копирования, если только он не удалён.

Чтобы реально переместить, нужно явно вызвать std::move:


std::string local = std::move(s); // ОК — move-конструктор


Но будь осторожен:


std::string getStr() {
std::string tmp = "hello";
return std::move(tmp); // Не всегда нужно!
}


Здесь std::move ломает RVO (Return Value Optimization). Компилятор мог бы вернуть tmp без перемещения, вообще без копий. А std::move мешает, заставляя делать move-конструктор.

Выводы:
std::move не двигает, он обещает, что ты больше не тронешь объект
– Будь осторожен с std::move в return
– Не забудь, что lvalue остаётся lvalue, даже если ты его "обернул" std::move

➡️ @cpp_geek



tg-me.com/cpp_geek/316
Create:
Last Update:

Почему std::move может не сработать, как ты ожидал

Всё просто? Хочешь передать объект по move — вызываешь std::move(obj) и думаешь, что теперь точно будет перемещение. Но не всё так однозначно.


void foo(std::string s) {
std::string local = std::move(s);
}


Выглядит, будто s перемещается в local. Но на практике — нет. Здесь копирование. Почему?

s — это lvalue, несмотря на std::move в правой части. А значит, выбирается std::string конструктор копирования, если только он не удалён.

Чтобы реально переместить, нужно явно вызвать std::move:


std::string local = std::move(s); // ОК — move-конструктор


Но будь осторожен:


std::string getStr() {
std::string tmp = "hello";
return std::move(tmp); // Не всегда нужно!
}


Здесь std::move ломает RVO (Return Value Optimization). Компилятор мог бы вернуть tmp без перемещения, вообще без копий. А std::move мешает, заставляя делать move-конструктор.

Выводы:
std::move не двигает, он обещает, что ты больше не тронешь объект
– Будь осторожен с std::move в return
– Не забудь, что lvalue остаётся lvalue, даже если ты его "обернул" std::move

➡️ @cpp_geek

BY C++ geek




Share with your friend now:
tg-me.com/cpp_geek/316

View MORE
Open in Telegram


telegram Telegram | DID YOU KNOW?

Date: |

The lead from Wall Street offers little clarity as the major averages opened lower on Friday and then bounced back and forth across the unchanged line, finally finishing mixed and little changed.The Dow added 33.18 points or 0.10 percent to finish at 34,798.00, while the NASDAQ eased 4.54 points or 0.03 percent to close at 15,047.70 and the S&P 500 rose 6.50 points or 0.15 percent to end at 4,455.48. For the week, the Dow rose 0.6 percent, the NASDAQ added 0.1 percent and the S&P gained 0.5 percent.The lackluster performance on Wall Street came on uncertainty about the outlook for the markets following recent volatility.

Pinterest (PINS) Stock Sinks As Market Gains

Pinterest (PINS) closed at $71.75 in the latest trading session, marking a -0.18% move from the prior day. This change lagged the S&P 500's daily gain of 0.1%. Meanwhile, the Dow gained 0.9%, and the Nasdaq, a tech-heavy index, lost 0.59%. Heading into today, shares of the digital pinboard and shopping tool company had lost 17.41% over the past month, lagging the Computer and Technology sector's loss of 5.38% and the S&P 500's gain of 0.71% in that time. Investors will be hoping for strength from PINS as it approaches its next earnings release. The company is expected to report EPS of $0.07, up 170% from the prior-year quarter. Our most recent consensus estimate is calling for quarterly revenue of $467.87 million, up 72.05% from the year-ago period.

telegram from ar


Telegram C++ geek
FROM USA