是否允许C++编译器/链接器删除未使用的方法?

ver*_*sat 4 c++ methods optimization

是否允许C++编译器或链接器(通过任何C++标准)删除未使用的方法?似乎允许编译器删除未使用的静态函数,允许链接器删除未使用的函数.但我没有找到任何信息类似于方法的信息.当方法是虚拟的时,这真的很有趣.

Mar*_*ica 5

是.

如果该方法未被使用,则无法告知它已被删除 - 因此链接器可以这样做.请注意,获取方法的地址可能会被视为"使用"该方法 - 而不仅仅是实际调用它.

链接器很可能删除非虚拟成员函数(它很容易并节省空间).

它们可以删除未使用的虚函数,但编译器必须添加大量有关它调用的虚函数的信息,以便链接器可以删除未使用的虚函数(并可能压缩vtable).在实践中,我不认为链接器这样做是因为增益可能很小并且开发工作量需要相当大.

  • 链接器不会创建库(静态的).对于共享库,导出时"使用"所有公共符号. (2认同)

Chr*_*ckl 3

C++ 标准在更抽象的层面上工作。它不需要 C++ 实现实际上由编译器和链接器等单独的工具组成。

\n\n

顺便说一句,我刚刚在我的机器上搜索了PDF 草稿,整个 1368 页的文档中只有一个“链接器”一词,甚至只是在第 22 页有关字符集的脚注中。

\n\n

该标准实际上谈论的是所谓的“假设”规则

\n\n

引用\xc2\xa71.9:

\n\n
\n

(...) 需要一致的实现来模拟(仅)抽象机的可观察行为,如下所述。

\n
\n\n

在这句话的脚注中,进一步指出:

\n\n
\n

此规定有时称为 \xe2\x80\x9cas-if\xe2\x80\x9d 规则,因为\n 实现可以自由地忽略此\n 国际标准的任何要求,只要结果与要求相同\n从程序的可观察行为可以确定,n 已被遵守。

\n
\n\n

如果某个函数没有以任何方式在程序中的任何地方使用,那么它不会对可观察的行为产生任何影响。因此,“as-if”规则本身就赋予编译器或链接器完全的自由,可以将其从可执行结果中删除。

\n