mas*_*oud 47 c++ optimization gcc
RVO(返回值优化)是否保证适用于C++编译器(特别是GCC)中的所有对象和情境?
如果答案是"否",那么对类/对象进行优化的条件是什么?如何强制或鼓励编译器对特定的返回值执行RVO?
Dav*_*eas 45
始终可以应用返回值优化,不能普遍应用的是命名返回值优化.基本上,为了进行优化,编译器必须知道在构造对象的位置将返回什么对象.
在RVO(返回临时的情况)的情况下,该条件得到满足:对象在return语句中构造,并且返回它.
对于NRVO,您必须分析代码以了解编译器是否可以知道该信息.如果对函数的分析很简单,那么编译器可能会对它进行优化(例如,不包含条件的单个return语句;同一个对象的多个return语句;多个返回语句,如T f() { if (condition) { T r; return r; } else { T r2; return r2; } }
编译器知道r
或r2
将会被退回...)
请注意,您只能在简单情况下假设优化,具体而言,维基百科中的示例实际上可以通过足够聪明的编译器进行优化:
std::string f( bool x ) {
std::string a("a"), b("b");
if ( x ) return a;
else return b;
}
Run Code Online (Sandbox Code Playgroud)
可以由编译器重写为:
std::string f( bool x ) {
if ( x ) {
std::string a("a"), b("b");
return a;
} else {
std::string a("a"), b("b");
return b;
}
}
Run Code Online (Sandbox Code Playgroud)
并且编译器此时可以知道在第一个分支a
中构造代替返回的对象,并且在第二个分支中同样适用b
.但我不指望这一点.如果代码很复杂,则假设编译器无法生成优化.
编辑:有一个我没有明确提到的情况,不允许编译器(在大多数情况下,即使它被允许,也不可能这样做)来优化从函数的参数到return语句的副本:
T f( T value ) { return value; } // Cannot be optimized away --but can be converted into
// a move operation if available.
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
10384 次 |
最近记录: |