gal*_*tte 37 c++ compiler-construction optimization call
例如,如果我有这个代码:
class SomeDataProcessor
{
public:
bool calc(const SomeData & d1, const SomeData & d2) const;
private:
//Some non-mutable, non-static member variables
}
SomeDataProcessor sdp;
SomeData data1;
SomeData data2;
someObscureFunction(sdp.calc(data1, data2),
sdp.calc(data1, data2));
Run Code Online (Sandbox Code Playgroud)
让我们考虑可能等效的代码:
bool b = sdp.calc(data1, data2);
someObscureFunction(b,b);
Run Code Online (Sandbox Code Playgroud)
为了使其有效,该calc()函数应满足一些要求,对于该示例,我调用该属性_pure_const_formula_
A _pure_const_formula_会:
_pure_const_formula_功能例如,调用随机数生成器不符合这些要求.
是否允许编译器用第二个代码替换第一个代码,即使它需要递归地挖掘到被调用的函数中?现代编译器能够做到这一点吗?
Tam*_*ola 46
GCC具有用于函数的pure 属性(用作__attribute__((pure))),告诉编译器可以消除冗余调用.它用于例如strlen.
我不知道任何编译器会自动执行此操作,特别是考虑到要调用的函数可能无法以源代码形式提供,并且目标文件格式不包含有关函数是否为纯函数的元数据.
Lig*_*ica 22
是的,一点没错.
例如,如果您的所有函数都返回true,并且其定义对于调用点处的编译器是可见的,那么整个函数调用可能会被省略,从而导致:
someObscureFunction(true, true);
Run Code Online (Sandbox Code Playgroud)
编译器具有足够信息的程序可以从相当复杂的任务链"优化"到可能一个或两个指令.现在,实际对成员变量进行操作会在一定程度上将优化器推到极限,但如果变量是private,给定一个已知的初始值,并且没有被任何其他成员函数变异,我不明白为什么编译器不能如果它想要,只是内联其已知值.编译器非常非常聪明.
人们认为编译的程序是源代码中行的一对一映射,但这几乎不可能.C++的全部目的是它是计算机在运行程序时实际要做的事情的抽象.
Sam*_*hik 10
不,给定显示的代码,编译器不能保证所提出的优化将没有可观察到的差异,并且没有现代编译器能够优化掉第二个函数调用.
一个非常简单的示例:此类方法可能使用随机数生成器,并将结果保存在某个私有缓冲区中,稍后将读取其他部分代码.显然,消除函数调用现在导致在该缓冲区中放置的随机生成的值更少.
换句话说,仅仅因为类方法const并不意味着它在被调用时没有可观察到的副作用.