【发布时间】:2018-01-22 16:03:38
【问题描述】:
编辑:它不是重复的,因为这个问题询问编译器在 O0 中的决定。
据说here 名称返回值优化(NRVO)是许多编译器支持的优化。但它是必须的还是只是一个不错的优化?
我的情况是,为了方便调试,我想使用-O0 进行编译(即没有优化),但我也希望为返回对象(例如向量)的返回语句启用 NRVO。如果 NRVO 不是必须的,编译器可能不会在 -O0 模式下执行此操作。在这种情况下,我应该更喜欢这段代码吗:
std::vector<int> foo() {
std::vector<int> v(100000,1); // an object that is really big..
return std::move(v); // explicitly move
}
在下面?
std::vector<int> foo() {
std::vector<int> v(100000,1);
return v; // copy or move?
}
编辑:我使用的编译器是 GCC6,但我希望代码独立于编译器。
【问题讨论】:
-
返回值是否被复制或移动取决于函数的返回类型及其调用上下文。函数内部发生的任何事情都不会对此产生任何影响。
-
move是多余的,因为该值已经是一个右值(xvalue),并且它禁止复制省略。所以总体上只是悲观。另外,不要优化未优化的构建。 -
您唯一关心的应该是最佳算法的正确性和选择。代码优化是编译器的关注点。几乎总是喜欢按值返回而不是按右值引用返回。