据我了解,现代 c++ 编译器在以下方面采取了捷径:
if(true)
{do stuff}
但是像这样的东西怎么样:
bool foo(){return true}
...
if(foo())
{do stuff}
Or:
class Functor
{
public:
bool operator() () { return true;}
}
...
Functor f;
if(f()){do stuff}
据我了解,现代 c++ 编译器在以下方面采取了捷径:
if(true)
{do stuff}
但是像这样的东西怎么样:
bool foo(){return true}
...
if(foo())
{do stuff}
Or:
class Functor
{
public:
bool operator() () { return true;}
}
...
Functor f;
if(f()){do stuff}
这取决于编译器是否可以foo()
在同一个编译单元中看到。
启用优化后,如果foo()
与调用者在同一个编译单元中,它可能会内联调用foo()
,然后优化被简化为与if (true)
以前相同的检查。
如果您移动foo()
到单独的编译单元,内联将不再发生,因此大多数编译器将不再能够优化此代码。(链接时优化可以跨编译单元进行优化,但它不太常见——并非所有编译器都支持它,而且通常它的效率较低。)
我刚刚尝试过g++ 4.7.2
,-O3
在这两个示例中,它都优化了调用。没有-O
,它不会。
现代编译器非常聪明,并且经常进行“整个程序优化”。所以只要你做一些明智的事情,它肯定会优化掉只返回一个常量值的函数调用。编译器还将内联只调用一次的代码[即使它非常大],因此编写小函数而不是大函数绝对值得做。当然,多次使用该函数,它可能不会内联它,但是通过从两个地方调用相同的函数和整体代码更小的代码,您可以获得更好的缓存命中率。