为什么g ++在编译的二进制文件中存储类名?

时间:2011-02-09 17:35:56

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

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

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

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

3 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分:4)

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

答案 2 :(得分:3)

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