现代编译器可以优化表达式从函数派生的常量表达式吗?

时间:2012-12-21 18:57:05

标签: c++ performance compiler-construction compiler-optimization

据我所知,现代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}

3 个答案:

答案 0 :(得分:5)

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

启用优化后,如果foo()与呼叫者位于同一个编译单元中,则可能会内联对foo()的调用,然后将优化简化为与if (true)相同的foo()检查。之前。

如果将{{1}}移动到单独的编译单元,则无法再进行内联,因此大多数编译器将无法再优化此代码。 (链接时优化可以在编译单元之间进行优化,但它不太常见 - 并非所有编译器都支持它,并且通常它的效率较低。)

答案 1 :(得分:4)

我刚刚使用g++ 4.7.2尝试了-O3,并且在两个示例中都优化了调用。如果没有-O,则不会。

答案 2 :(得分:1)

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