Информация об изменениях

Сообщение Re[2]: Про перемещение (на примере кода) от 15.03.2025 17:34

Изменено 15.03.2025 17:52 Shmj

Re[2]: Про перемещение (на примере кода)
Здравствуйте, T4r4sB, Вы писали:

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 из функции — может порождать копию. Так ведь?

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% гарантию что копия не порождается?