名称篡改是否适用于c++中的虚拟函数

Does name mangling apply to virtual functions in c++?

本文关键字:虚拟 函数 c++ 适用于 是否      更新时间:2023-10-16

我们都知道C++中的所有函数只在编译时被名称篡改,所以这也适用于虚拟函数吗?

是。成员函数名称已损坏。他们需要嵌入他们的参数类型,这样你就可以用不同的参数类型重载他们。

理论上,编译器可以用其他方式对参数类型进行编码,但在某种程度上,每个函数体都需要用函数名及其参数类型来标记(并使用它来解析对它的引用)。所有主要的编译器都使用mangling。

名称篡改与成员函数是否虚拟无关;毕竟,虚拟方法可以像任何成员函数一样被非虚拟地调用。只有当编译器能够确定虚拟方法是通过vtable独占调用的,它才能避免为该方法生成任何链接器符号(只需将其地址插入vtable中)。但我不认为编译器有任何实际的方法可以知道一个方法没有在另一个编译单元中直接调用(就像它可以用于仅在当前编译单元中可见的函数一样)。