编译器是否为所有类都为其创建了Vtable?
|
在线上有许多有关VTables的资源。他们通常对他们有相同的陈述:
\“每当一个类本身包含虚函数或从父类覆盖虚函数时,编译器都会为该类建立一个vtable。这意味着并非所有类都具有由编译器为其创建的vtable。vtable包含指向以下对象的函数指针该类中的虚函数。每个类只能有一个vtable,并且同一类的所有对象将共享相同的vtable。\“
那么,这到底为什么意味着并非所有类都具有由编译器为其创建的vtable?是因为somc类没有虚函数吗?
没有找到相关结果
已邀请:
3 个回复
肺鬼耙扮群
这将打印
的信息。在大多数非常规情况下,编译器无法提前知道在其上调用虚拟方法的对象的类型。如上所述,vtable通过提供统一的查找机制来查找方法实现而解决了该问题,无论对象的类型如何。 vtable指针必须存在于类的每个实例中(这需要附加内存的指针大小,可能为4或8个字节),并且程序地址空间中的某些数量的静态内存微不足道。在您看来,这似乎并不多(确实很多人都会同意),但是在某些情况下(例如内存极为有限的嵌入式系统),这可能会很麻烦。每个类都有vtable会违反一般的C ++原则,即只为使用的内容付费,因此,编译器无需生成任何vtable。 没有vtable具有禁用运行时类型信息的显着副作用。如果您需要在代码中使用RTTI,则您的类必须至少具有一个虚拟方法。在这些情况下,惯例是将析构函数标记为虚拟。
渴翅吮斡撤
晤默报
(特定于编译器)