如果编译器可以证明一个类的(私有(private))成员从未被使用过,包括潜在的 friend ,标准是否允许编译器从类的内存占用中删除这个成员?
不言而喻,在编译时这对于 protected 成员或公共(public)成员是不可能的,但在某些情况下,可能会针对私有(private)数据成员构建这样的证明。
相关问题:
最佳答案
理论上可能(以及未使用的公共(public)成员),但不是我们习惯的那种编译器生态系统(针对可以链接单独编译代码的固定 ABI)。 删除未使用的成员只能通过禁止单独库的整个程序优化来完成 1.
其他编译单元可能需要同意 sizeof(foo)
, 但这不是你可以从 .h
得到的东西如果它依赖于验证成员函数行为的实现不依赖于任何私有(private)成员。
请记住,C++ 只真正指定了一个程序,而不是一种创建库的方式。 ISO C++ 指定的语言与我们习惯的实现风格兼容(当然),但是采用所有 .cpp
的实现和 .h
文件并生成一个独立的不可扩展的可执行文件是可能的。
如果您对实现进行了足够的限制(没有固定的 ABI),则可以在整个程序中积极应用 as-if 规则。
脚注 1:如果编译器已经可以看到类中声明的每个成员函数的定义,我将添加“或以某种方式将大小信息导出到正在编译的其他代码”作为允许库的一种方式。但是@PasserBy 的回答指出,单独编译的库可能是以最终产生外部可见副作用(如 I/O)的方式使用声明的私有(private)成员的东西。所以我们必须完全排除它们。
鉴于此,公共(public)成员和私有(private)成员对于这种优化是等价的。
关于c++ - 编译器是否允许优化私有(private)数据成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65201486/