【发布时间】:2021-03-19 22:13:06
【问题描述】:
如果编译器可以证明一个类的(私有)成员从未被使用过,包括潜在的朋友,标准是否允许编译器从类的内存占用中删除该成员?
不言而喻,在编译时这对于受保护成员或公共成员是不可能的,但在某些情况下,可能会针对私有数据成员构建这样的证明。
相关问题:
【问题讨论】:
-
*具有相同访问控制(第 11 条)的(非联合)类的非静态数据成员被分配,以便后面的成员在类对象中具有更高的地址。 * (9.2.14)。但是,我不清楚这是否意味着编译器无法删除元素。被移除的元素不会有更高的地址...,但它不需要地址...
-
只是想在这里寻找扳手投入工作......但是如果其他地方的代码将使用
sizeof(myClass)类型的操作怎么办?我真的想不出为什么会这样做,但如果一个成员被优化掉,那可能会破坏。 -
@AdrianMole:非常好的一点——即使潜在的访问是有限的(朋友和成员),即使所有这些有限的访问在一个编译单元中对编译器都是可见的,它也需要假设
sizeof(T)用于其他一些对某些定义缺乏可见性的编译单元。由于其他编译单元无法执行优化,因此没有编译单元可以执行优化。 -
@AdrianMole 为什么会中断?类型的大小取决于编译器 IIRC。无论如何都允许将大小膨胀到超出成员所需的原始字节,那么为什么不减少它呢?
-
@AdrianMole “我真的想不出它为什么会这样做”——它对每个数组访问都这样做(在后台)。但正如 OP 正确指出的那样,大小不一定反映类的确切成员。
标签: c++ optimization compilation language-lawyer