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