C++ 为什么g++;在已编译的二进制文件中存储类名?
我注意到,如果我在由C++ 为什么g++;在已编译的二进制文件中存储类名?,c++,gcc,g++,virtual-functions,C++,Gcc,G++,Virtual Functions,我注意到,如果我在由g++编译的程序上运行strings,则输出包含它使用的各种类的名称 程序是用-O3编译的,没有-g或-p,当我去掉二进制文件时,类名仍然存在 我想知道为什么g++需要将这些信息存储在二进制文件中?出现的类名似乎都是使用虚拟函数的类,因此我怀疑这与此有关。这可能与此有关,具体来说,RTTI允许您查询给定变量的类的名称。查看关键字。如果是这种情况,那么它将解释为什么它只发生在具有虚拟函数的类上——RTTI只适用于具有虚拟函数的类 Edit:正如@xeno所指出的,它确实是RTT
g++
编译的程序上运行strings
,则输出包含它使用的各种类的名称
程序是用-O3
编译的,没有-g
或-p
,当我去掉二进制文件时,类名仍然存在
我想知道为什么
g++
需要将这些信息存储在二进制文件中?出现的类名似乎都是使用虚拟函数的类,因此我怀疑这与此有关。这可能与此有关,具体来说,RTTI允许您查询给定变量的类的名称。查看关键字。如果是这种情况,那么它将解释为什么它只发生在具有虚拟函数的类上——RTTI只适用于具有虚拟函数的类
Edit:正如@xeno所指出的,它确实是RTTI,如果您添加
-fno-RTTI
,则类名不会出现在字符串输出中。是的,它可能与g++如何实现RTTI有关。它需要能够在运行时在类树中搜索正确的类型,因此它必须以某种方式存储该树。任何具有虚拟函数的类都被认为是“多态的”,需要在可执行文件中包含特殊的RTTI信息。虽然标准没有说明这是如何实现的,但是类名与任何东西一样有意义。g++默认启用了RTTI。如果您不需要rtti,请使用-fno-rtti开关,您会发现字符串不存在。参考点:使用g++-c blah.o blah.cpp
在将其链接为可执行文件之前不包括类名。是的,它看起来是rtti,我用-fno-rtti再次编译,类名不会出现在字符串输出中。@Xeno:gcc在使用typeid(x).name()
时返回一个类的损坏名称。我只是用-fno-rtti编译代码,在字符串输出中仍然可以看到函数名……我不确定,但函数名可能与类名不同。这实际上并不需要存储名称,只需要一个id。例如,哈希也可以。幸好我从未声称它会这样做。请注意,禁用RTTI通常也会禁用异常,因为RTTI和异常处理通常共享许多机制。