编辑:它不是重复的,因为这个问题询问编译器在 O0 中的决定。
这里说名称返回值优化(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,但我希望代码独立于编译器。