如果编译器可以证明一个类的(私有)成员从未被使用过,包括被潜在的朋友使用过,那么标准是否允许编译器从类的内存占用中移除这个成员?
不言而喻,在编译时,对于受保护的成员或公共成员,这是不可能的,但在某些情况下,对于私有数据成员,可以构造这样的证明。
相关问题:
如果编译器可以证明类的(私有)成员从未被使用
编译器无法证明这一点,因为私有成员可以在其他编译单元中使用。具体地说,这在根据标准的[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
}