2

编译以下类

class Interface
{
  virtual void doIt() = 0;
  virtual ~Interface() = 0;
};

inline Interface::~Interface() {}

使用gcc -fdump-class-hierarchy.

gcc发出

类接口
   尺寸=4 对齐=4
   基本尺寸=4 基本对齐=4
接口 (0x1a779c0) 0 几乎为空
    vptr=((&接口::_ZTV9接口) + 8u)

“近乎空”的意义是什么?这是什么意思?

4

4 回答 4

7

C++ 有一种叫做“空基优化”的东西。如果一个类没有成员,当它用作基类时,它不需要占用空间。为什么这很重要的一个例子是std::unary_function<T, U>。它的存在是为了为您提供一组简单的 typedef。这些 typedef 不应影响仿函数类的大小。

如果您有一个带有 vtable 指针的基类,则该指针很可能与派生类共享。您只需为派生类创建一个 vtable,它在基类之后添加自己的方法。

您现在可以实现类似的“无额外开销”基类。显然 GCC 称之为“几乎是空的”。

于 2009-07-20T11:29:20.637 回答
6

我想这是为了将它与“空”区分开来,如果编译一个完全没有成员的类,就会得到它。“几乎是空的”似乎意味着它有一个 vtable 而没有别的。

于 2009-07-20T11:22:27.890 回答
4

C++ ABI提供了“近乎空”的类的定义以及它们如何影响 vtable 构造的有趣讨论:

一个包含虚拟指针的类,但除了(可能)虚拟基之外没有其他数据。特别是,它:

  • 除了零宽度位域之外,没有非静态数据成员,
  • 没有非空、几乎空或虚拟的直接基类,
  • 至多有一个非虚拟的、几乎为空的直接基类,并且
  • 没有适当的基类是空的,在道德上不是虚拟的,并且偏移量不是零。

我在研究几乎空的虚拟基础对对象大小、vtable 大小和虚拟调用开销的影响时遇到了这个问题。

于 2010-06-29T21:50:19.403 回答
3

它只有一个 vtable,没有数据字段。

于 2009-07-20T11:17:56.323 回答