【问题标题】:Why does g++ store class names in the compiled binary?为什么 g++ 将类名存储在编译后的二进制文件中?
【发布时间】:2011-06-24 07:39:11
【问题描述】:

我注意到,如果我在由g++ 编译的程序上运行strings,则输出包含它使用的各种类的名称。

程序使用-O3 编译,没有-g-p,当我剥离二进制文件时类名仍然存在。

我想知道为什么g++ 必须将此信息存储在二进制文件中?出现的类名似乎都是使用虚函数的类,所以我怀疑这与它有关。

【问题讨论】:

  • 参考点:使用g++ -c blah.o blah.cpp 直到将其链接为可执行文件后才包含类名。

标签: c++ gcc g++ virtual-functions


【解决方案1】:

这可能与RTTI 有关,具体来说,RTTI 允许您查询给定变量的类的名称。请参阅 typeid 关键字。如果是这种情况,那么它就可以解释为什么它只发生在具有虚函数的类上——RTTI 只适用于具有虚函数的类。

编辑:正如@xeno 指出的那样,它确实是RTTI,如果添加-fno-rtti,则类名不会出现在字符串输出中。

【讨论】:

  • 是的,它看起来是RTTI,我用-fno-rtti 再次编译并且类名没有出现在字符串输出中。
  • @Xeno:当你使用typeid(x).name()时,gcc会返回一个类的错位名称。
  • 我刚刚用 -fno-rtti 编译了我的代码,我仍然在字符串输出中看到函数的名称...
  • 我不确定,但函数名可能与类名不同。
【解决方案2】:

g++ 默认启用 RTTI。如果您不需要 RTTI,请使用 -fno-rtti 开关,您会发现字符串不存在。

【讨论】:

  • 请注意,禁用 RTTI 通常也会禁用异常,因为 RTTI 和异常处理通常共享许多机制。
【解决方案3】:

是的,这可能与 g++ 如何实现 RTTI 有关。它需要能够在运行时通过类树搜索正确的类型,因此它必须以某种方式存储该树。任何具有虚函数的类都被认为是“多态的”,并且需要在可执行文件中包含特殊的 RTTI 信息。虽然标准并没有说明这是如何完成的,但类名与任何东西一样有意义。

【讨论】:

  • 这实际上不需要存储名称,只需要存储一个 id。例如,哈希也可以。
  • 幸好我从来没有声称它做到了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-07
  • 1970-01-01
  • 1970-01-01
  • 2020-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多