4

据我了解,现代 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}
4

3 回答 3

5

这取决于编译器是否可以foo()在同一个编译单元中看到。

启用优化后,如果foo()与调用者在同一个编译单元中,它可能会内联调用foo(),然后优化被简化为与if (true)以前相同的检查。

如果您移动foo()到单独的编译单元,内联将不再发生,因此大多数编译器将不再能够优化此代码。(链接时优化可以跨编译单元进行优化,但它不太常见——并非所有编译器都支持它,而且通常它的效率较低。)

于 2012-12-21T19:06:59.783 回答
4

我刚刚尝试过g++ 4.7.2-O3在这两个示例中,它都优化了调用。没有-O,它不会。

于 2012-12-21T19:00:15.910 回答
1

现代编译器非常聪明,并且经常进行“整个程序优化”。所以只要你做一些明智的事情,它肯定会优化掉只返回一个常量值的函数调用。编译器还将内联只调用一次的代码[即使它非常大],因此编写小函数而不是大函数绝对值得做。当然,多次使用该函数,它可能不会内联它,但是通过从两个地方调用相同的函数和整体代码更小的代码,您可以获得更好的缓存命中率。

于 2012-12-21T19:26:44.997 回答