编辑:它不是重复,因为这个问题询问编译器在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
}
Run Code Online (Sandbox Code Playgroud)
在这下面?
std::vector<int> foo() {
std::vector<int> v(100000,1);
return v; // copy or move?
}
Run Code Online (Sandbox Code Playgroud)
编辑:我使用的编译器是GCC6,但我希望代码与编译器无关.
你应该更喜欢
std::vector<int> foo() {
std::vector<int> v(100000,1);
return v; // move or NRVO
}
Run Code Online (Sandbox Code Playgroud)
过度
std::vector<int> foo() {
std::vector<int> v(100000,1);
return std::move(v); // move
}
Run Code Online (Sandbox Code Playgroud)
第二个片段阻止了NRVO,在最坏的情况下,两个片段都会移动构造.
归档时间: |
|
查看次数: |
502 次 |
最近记录: |