Сообщение Re[2]: Про перемещение (на примере кода) от 15.03.2025 17:34
Изменено 15.03.2025 17:52 Shmj
Re[2]: Про перемещение (на примере кода)
Здравствуйте, T4r4sB, Вы писали:
TB>Вот тут тоже убери двойной амперсанд. В переменной значение же? Значит так и пиши в объявлении
Ну смотрите, получается что обычный возврат return из функции — может порождать копию. Так ведь?
Однако если срабатывает некая оптимизация, то копия уже не порождается. К примеру тут:
Правильно ли я понял, что это благодаря умному компилятору и NRVO ? И всегда ли можно на это рассчитывать, всегда ли имеем 100% гарантию что копия не порождается?
TB>Вот тут тоже убери двойной амперсанд. В переменной значение же? Значит так и пиши в объявлении
Ну смотрите, получается что обычный возврат return из функции — может порождать копию. Так ведь?
class Wrapper {
private:
TrackedClass _trackedClass;
public:
Wrapper() : _trackedClass(1) {
}
TrackedClass take() {
return _trackedClass;
}
};
TrackedClass fun1() {
Wrapper w = Wrapper();
TrackedClass t = w.take(); // <- тут копия порождается.
return t;
}
Однако если срабатывает некая оптимизация, то копия уже не порождается. К примеру тут:
class Wrapper {
private:
TrackedClass _trackedClass;
public:
Wrapper() : _trackedClass(1) {
}
TrackedClass take() {
TrackedClass tc = std::move(_trackedClass); // <- Копия не порождается.
return tc;
}
};
TrackedClass fun1() {
Wrapper w = Wrapper();
TrackedClass t = w.take(); // <- а теперь копия НЕ порождается.
return t;
}
int main(int argc, const char * argv[]) {
TrackedClass t = fun1();
t.test();
std::cout << "test" << std::endl;
}
Правильно ли я понял, что это благодаря умному компилятору и NRVO ? И всегда ли можно на это рассчитывать, всегда ли имеем 100% гарантию что копия не порождается?
Re[2]: Про перемещение (на примере кода)
Здравствуйте, T4r4sB, Вы писали:
TB>Вот тут тоже убери двойной амперсанд. В переменной значение же? Значит так и пиши в объявлении
Ну смотрите, получается что обычный возврат return из функции — может порождать копию. Так ведь?
Однако если срабатывает некая оптимизация, то копия уже не порождается. К примеру тут:
Правильно ли я понял, что это благодаря умному компилятору и NRVO ? И всегда ли можно на это рассчитывать, всегда ли имеем 100% гарантию что копия не порождается?
TB>Вот тут тоже убери двойной амперсанд. В переменной значение же? Значит так и пиши в объявлении
Ну смотрите, получается что обычный возврат return из функции — может порождать копию. Так ведь?
class Wrapper {
private:
TrackedClass _trackedClass;
public:
Wrapper() : _trackedClass(1) {
}
TrackedClass take() {
return _trackedClass; // <- тут копия порождается.
}
};
TrackedClass fun1() {
Wrapper w = Wrapper();
TrackedClass t = w.take();
return t;
}
Однако если срабатывает некая оптимизация, то копия уже не порождается. К примеру тут:
class Wrapper {
private:
TrackedClass _trackedClass;
public:
Wrapper() : _trackedClass(1) {
}
TrackedClass take() {
TrackedClass tc = std::move(_trackedClass); // <- Копия не порождается.
return tc;
}
};
TrackedClass fun1() {
Wrapper w = Wrapper();
TrackedClass t = w.take(); // <- копия НЕ порождается.
return t;
}
int main(int argc, const char * argv[]) {
TrackedClass t = fun1();
t.test();
std::cout << "test" << std::endl;
}
Правильно ли я понял, что это благодаря умному компилятору и NRVO ? И всегда ли можно на это рассчитывать, всегда ли имеем 100% гарантию что копия не порождается?