提问者:小点点

编译器是否可以优化私有数据成员?


如果编译器可以证明一个类的(私有)成员从未被使用过,包括被潜在的朋友使用过,那么标准是否允许编译器从类的内存占用中移除这个成员?

不言而喻,在编译时,对于受保护的成员或公共成员,这是不可能的,但在某些情况下,对于私有数据成员,可以构造这样的证明。

相关问题:

  • 幕后的公共,私人和保护(引发了这个问题)
  • 是否允许C++编译器优化未引用的本地对象(关于自动对象)

共2个答案

匿名用户

如果编译器可以证明类的(私有)成员从未被使用

编译器无法证明这一点,因为私有成员可以在其他编译单元中使用。具体地说,这在根据标准的[temp.spec]/6的模板参数中指向成员的指针上下文中是可能的,正如Johannes Schaub最初描述的那样。

因此,总而言之:不,编译器不能比优化公共或受保护成员更优化私有数据成员(受as-if规则约束)。

匿名用户

不,因为你可以合法地颠覆访问控制系统。

class A
{
    int x;
};

template<int>
struct tag
{
    friend auto huh(tag);
};

template<auto x, int n>
struct cheat
{
    friend auto huh(tag<n>) { return x; }
};

template struct cheat<&A::x, 0>;

auto& foo(A& a)
{
    return a.*huh(tag<0>{});  // returns a.x
}