【发布时间】:2011-11-07 20:04:07
【问题描述】:
所以我有一个问题要问你。 :) 你能告诉我以下代码应该产生的输出吗?
#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
- 移动 ctor
- dtor
- dtor
- dtor
确实如此,但只有在关闭编译器优化时。当优化打开时,输出完全不同。开启优化后,输出为:
- 演员
- 复制ctor
- dtor
- dtor
通过编译器优化,测试变量是返回变量。
我的问题是,什么条件会导致不能以这种方式优化?
我一直被教导,返回一个导致额外复制构造函数的结构/类可以通过作为引用传递来更好地优化,但编译器正在为我这样做。那么返回一个结构仍然被认为是错误的形式吗?
【问题讨论】:
-
这叫做返回值优化。
-
将您的问题重新格式化为更多采用这种格式会有所帮助:这是我的代码“”,这是我的结果。有什么办法可以得到“”
-
@mydogisbox:我发现这个问题其实很清楚。
-
但是@Mydogisbox,它已经是那种格式了。它显示了代码。它显示了预期结果和实际结果。然后它询问产生预期结果的必要条件。
-
@Rob Kennedy 该帖子以一个问题开始,然后在帖子中得到回答。最好不要这样做以减少问题的混乱。
标签: c++ visual-studio-2010 optimization g++