Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么g++;在已编译的二进制文件中存储类名?_C++_Gcc_G++_Virtual Functions - Fatal编程技术网

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和异常处理通常共享许多机制。