c++ - 编译器是否允许优化私有(private)数据成员?

标签 c++ optimization compilation language-lawyer

如果编译器可以证明一个类的(私有(private))成员从未被使用过,包括潜在的 friend ,标准是否允许编译器从类的内存占用中删除这个成员?
不言而喻,在编译时这对于 protected 成员或公共(public)成员是不可能的,但在某些情况下,可能会针对私有(private)数据成员构建这样的证明。

相关问题:

  • Behind the scenes of public, private and protected (引发这个问题)
  • Is C++ compiler allowed to optimize out unreferenced local objects (关于自动对象)
  • Will a static variable always use up memory? (关于静态对象)
  • 最佳答案

    理论上可能(以及未使用的公共(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/

    相关文章:

    c++ - 我如何能够将不完整的类本身用作参数?

    swift - 为什么编程语言(例如 Swift)不使用最快的可用排序——桶排序?

    c# - Emacs 'csharp-mode' 字节编译错误

    c++ - 为什么 C++ 链接器允许未定义的函数?

    javascript - Ramda R.pickBy R.identity 包括零 0

    .net - 无法加载引用库 - 该进程无法访问该文件,因为该文件正在被另一个进程使用

    c++ - 如何适应写入 tcp 套接字的时间可变性?

    c++ - OpenCL - 从缓冲区读取时出现 CL_INVALID_VALUE

    c++ - 在其参数结构上重载 C/C++ 预处理器宏

    Java:如何优化大数组的总和