Итак, у меня есть к вам вопрос.:) Можете ли вы сказать мне вывод, который должен выдать следующий код?
#include <iostream>
struct Optimized
{
Optimized() { std::cout << "ctor" << std::endl; }
~Optimized() { std::cout << "dtor" << std::endl; }
Optimized(const Optimized& copy) { std::cout << "copy ctor" << std::endl; }
Optimized(Optimized&& move) { std::cout << "move ctor" << std::endl; }
const Optimized& operator=(const Optimized& rhs) { std::cout << "assignment operator" << std::endl; return *this; }
Optimized& operator=(Optimized&& lhs) { std::cout << "move assignment operator" << std::endl; return *this; }
};
Optimized TestFunction()
{
Optimized a;
Optimized b = a;
return b;
}
int main(int argc, char* argv[])
{
Optimized test = TestFunction();
return 0;
}
Мой первый ответ будет:
- ctor
- copy ctor
- move ctor
- dtor
- dtor
- dtor
, и это правда, но только если оптимизация компилятора включенаот .Когда оптимизация включена, выходной сигнал совершенно другой.При включенной оптимизации вывод:
- ctor
- copy ctor
- dtor
- dtor
При оптимизации компилятора тестовая переменная - это возвращаемая переменная.
Мой вопрос: какие условия могут привести к тому, что это не будет оптимизировано таким образом?
Меня всегда учили, что возвращать struct /Класс, который приводит к дополнительным конструкторам копирования, можно было бы лучше оптимизировать, передав его в качестве ссылки, но компилятор делает это для меня.Значит, возвращение - это все еще плохая форма?