我有一个问题要问你。 :) 你能告诉我以下代码应该产生的输出吗?
#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;
}
我的第一反应是:
- 构造函数
- 拷贝构造函数
- 移动构造函数
- 析构函数
- 析构函数
- 析构函数
这是正确的,但只有在关闭编译器优化时才是如此。当开启优化时,输出完全不同。开启优化后,输出结果为:
- 构造函数
- 拷贝构造函数
- 析构函数
- 析构函数
通过编译器优化,测试变量成为返回变量。
我的问题是,什么条件会导致不能按这种方式进行优化?
我一直被教导,返回一个需要额外复制构造函数的结构/类可以通过作为引用传递来更好地进行优化,但是编译器正在为我完成这项工作。因此,返回结构是否仍被认为是不好的形式?