如果一个带有虚拟函数的类没有被使用,它会生成一个虚拟函数表吗



当在代码中定义了一个包含虚拟函数的类,但没有使用该类(没有声明或新建(时,是否会在编译时生成该类的虚拟表?

您可以编写一些简单的代码来测试编译器:

#include <iostream>
class Foo {
public:
void Fun() {std::cout << __FUNCTION__;}
virtual void VirtualFun() {std::cout << __FUNCTION__;}
};
int main() {
Foo foo;
foo.Fun();
return 0;
}

如果你不使用类

编译器将忽略该类,因此不会生成任何

如果使用类但不调用虚拟函数

对于gcc 10.2,它将生成虚拟表,并且与msvc2019相同。

虚拟函数表的存在是一个实现细节,因此任何答案都必须取决于所使用的编译器。然而,只要你意识到你所观察到的并不需要发生,看看一个特定的编译器就可以提供信息。

当gcc遇到一个应该为其生成虚拟函数表的类时,编译器会查看类定义,并根据某些条件选择一个方法(有关详细信息,请参阅gcc常见问题解答(。当gcc遇到该函数的定义时,会生成该类的虚拟函数表,并将其包含在生成的对象文件(也称为"已发射"(中。

所以,是的,虚拟函数表是生成的(至少是由gcc生成的(,即使程序没有使用它们。


不过还有另一个考虑因素。链接器可以省略它可以证明没有使用的东西。如果链接器有足够的信息来确定不需要某个虚拟函数表,则允许将该表排除在最终可执行文件之外。在这种情况下,您可能会遇到这样的情况:编译器生成了一个虚拟函数表,但它没有出现在可执行文件中。

因此,如果你更关心的是你的可执行文件大小,而不是编译时间,那么"是";变成";也许";。如果没有使用类,那么它的虚拟函数表可能不在可执行文件中,这取决于所使用的优化。

相关内容

最新更新