如果在代码中定义了包含虚函数的类,但没有使用该类(没有声明或新建),那么类的虚拟表是否会在编译时生成?
发布于 2021-01-14 10:56:40
您可以编写一些简单的code来测试您的编译器:
#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也是如此。
发布于 2021-01-15 02:41:01
虚函数表的存在是一个实现细节,因此任何答案都必须取决于所使用的编译器。但是,只要您意识到您观察到的内容不是必须发生的,那么查看一个特定的编译器可能会提供信息。
当gcc遇到应该为其生成虚拟函数表的类时,编译器会查看类定义,并根据特定条件选择一个方法(有关详细信息,请参阅GCC Frequently Asked Questions )。当gcc遇到该函数的定义时,将生成该类的虚拟函数表,并将其包括在生成的目标文件中(也称为"emitted")。
所以,是的,虚拟函数表是生成的(至少是由gcc生成的),即使它们不被您的程序使用。
不过,还有另一个考虑因素。链接程序is allowed to omit things that it can prove are not used。如果链接器有足够的信息来确定不需要某个虚拟函数表,则允许将该表留在最终可执行文件之外。在这种情况下,您可能会遇到这样的情况:编译器生成了一个虚拟函数表,但它并没有出现在您的可执行文件中。
因此,如果您更关心可执行文件的大小而不是编译时间,那么“是”就变成了“可能”。如果没有使用某个类,那么它的虚函数表可能不会出现在可执行文件中,这取决于所使用的优化。
https://stackoverflow.com/questions/65712624
复制相似问题