【发布时间】:2011-08-03 02:01:18
【问题描述】:
如果我像这样创建一个非常简单的类:
class A
{
public :
virtual void foo()
{
}
};
(无虚拟析构函数)编译器会创建 vtable 吗? 或者现代编译器是否足够聪明,可以识别这种情况(这可能是错误的复制和粘贴)并且不会为此类类添加虚拟表?
【问题讨论】:
-
一种常见的技术是使用第一个虚拟非内联成员发出 vtable。我不知道在这种情况下存在虚拟非内联成员的后备方案是什么,但这并不是比内联函数或模板实例化中的静态更糟糕的问题。
-
如果碰巧没有其他虚函数,虚析构函数只是强制类为多态的一种方式。 (如果您打算通过指向 A 的指针删除派生类,这也是必需的)。
-
@AProgrammer - 编译器可能必须生成大量 vtable 副本,并让链接器对其进行排序。