Итак, у меня есть вопрос для вас. :) Можете ли вы сказать мне выходной код, следующий код должен производить?
#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;
}
Мой первый ответ будет:
И это правда, но только если оптимизация компилятора выключена . При включении оптимизации вывод полностью отличается. С включенной оптимизацией вывод:
с оптимизацией компилятора, тестовая переменная является обратной переменной.
Мой вопрос, какие условия приведут к тому, что это не будет оптимизировано таким образом?
Я всегда учил, что возвращение структуры / класса, которые приводит к тому, что приводит к дополнительной копии конструкторов, могут быть лучше оптимизированы путем передачи в качестве ссылки Но компилятор делает это для меня. Так что возврат структура все еще считается плохой формой?