【发布时间】:2015-08-20 21:44:58
【问题描述】:
参考这个问题stackoverflow.com/q/14188612,有没有编译器折叠两个对象的方法实例化的情况?
假设我们有一个带有私有“无状态”方法add 的类,它不会修改类成员:
class Element
{
public:
Class(int a, int b) : a_(a), b_(b)
{
c_ = add(a, b);
}
private:
int add(int a, int b)
{
return a + b;
}
private:
int a_;
int b_;
int c_;
}
int main(void)
{
Element a(1, 2);
Element b(3, 4);
}
我们有时是否可以期望add 实际上会被编译为类似static 的方法?或者,更清楚一点,a.add 的地址等于b.add(add 只存储一次)。
这只是一个与理解编译器优化有关的问题。
【问题讨论】:
-
该方法很可能是内联的,这使得它是否是静态的无关紧要。但是您无法通过检查地址来判断 - 如果您获取函数的地址,那么编译器将为您提供非内联版本的地址,但可能永远不会调用它。查看生成的代码,它是唯一的真相来源。
-
所有函数总是最多存储一次。
标签: c++