编译以下类
class Interface
{
virtual void doIt() = 0;
virtual ~Interface() = 0;
};
inline Interface::~Interface() {}
使用
gcc -fdump-class-hierarchy
。
gcc
发出
类接口 大小=4 对齐=4 基本尺寸=4 基本对齐=4 接口 (0x1a779c0) 0 几乎为空 vptr=((&接口::_ZTV9Interface) + 8u)
“近乎空”的意义何在?是什么意思?
C++ 有一种叫做“空基优化”的东西。如果一个类没有成员,那么它作为基类时不需要占用空间。
std::unary_function<T, U>
可以说明为什么这一点很重要。它的存在是为了向您提供一组简单的类型定义。这些 typedef 不应该影响函子类的大小。
如果您有一个带有 vtable 指针的基类,则该指针很可能与派生类共享。您只需为派生类创建一个虚函数表,该虚函数表在基类的方法之后添加自己的方法。
您现在可以实现类似的“无额外开销”基类。显然 GCC 称其“几乎空了”。
我想这是为了将它与“空”区分开来,“空”是编译一个根本没有成员的类时得到的结果。 “几乎为空”似乎意味着它有一个 vtable 而没有其他东西。
C++ ABI 提供了“近乎空”类的定义以及它们如何影响 vtable 构造的有趣讨论:
包含虚拟指针的类,但除了(可能)虚拟基数之外没有其他数据。特别是,它:
- 除了零宽度位域之外没有非静态数据成员,
- 没有直接的基类,这些基类要么不是空的,几乎是空的,要么是虚拟的,
- 至多有一个非虚拟的、几乎为空的直接基类,并且
- 没有适当的基类,该基类是空的,不是道德上虚拟的,并且偏移量不为零。
我在研究几乎空的虚拟基数对对象大小、vtable 大小和虚拟调用开销的影响时遇到了这个问题。
它只有一个vtable,没有数据字段。