首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果没有使用具有虚函数的类,它会生成虚函数表吗?

如果没有使用具有虚函数的类,它会生成虚函数表吗?
EN

Stack Overflow用户
提问于 2021-01-14 10:37:35
回答 2查看 93关注 0票数 3

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

EN

回答 2

Stack Overflow用户

发布于 2021-01-14 10:56:40

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

代码语言:javascript
复制
#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也是如此。

票数 2
EN

Stack Overflow用户

发布于 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。如果链接器有足够的信息来确定不需要某个虚拟函数表,则允许将该表留在最终可执行文件之外。在这种情况下,您可能会遇到这样的情况:编译器生成了一个虚拟函数表,但它并没有出现在您的可执行文件中。

因此,如果您更关心可执行文件的大小而不是编译时间,那么“是”就变成了“可能”。如果没有使用某个类,那么它的虚函数表可能不会出现在可执行文件中,这取决于所使用的优化。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65712624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档