[英]Can modern compilers optimize constant expressions where the expression is derived from a function?
我的理解是,现代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()
移动到单独的编译单元,则内联不再发生,因此大多数编译器将无法再优化此代码。 (链接时优化可以在编译单元之间进行优化,但它不太常见 - 并非所有编译器都支持它,并且通常它的效率较低。)
我刚刚尝试了带有-O3
g++ 4.7.2
,并且在两个示例中都优化了调用。 没有-O
,它没有。
现代编译器非常聪明,并且经常进行“整个程序优化”。 因此,只要你做了明智的事情,它肯定会优化掉只返回常量值的函数调用。 编译器还将内联仅调用一次的代码[即使它非常大],因此编写小函数而不是大函数绝对值得做。 当然,多次使用该函数,它可能不会内联它,但是你可以通过从两个地方调用相同的函数和整体较小的代码来获得更好的缓存命中率。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.