编译以下类
class Interface
{
virtual void doIt() = 0;
virtual ~Interface() = 0;
};
inline Interface::~Interface() {}
使用gcc -fdump-class-hierarchy
。
gcc
发出
Class Interface size=4 align=4 base size=4 base align=4 Interface (0x1a779c0) 0 nearly-empty vptr=((& Interface::_ZTV9Interface) + 8u)
“近空”有什么意义?这是什么意思?
答案 0 :(得分:6)
我想将它与“空”区分开来,如果编译一个完全没有成员的类,你就会得到它。 “几乎是空的”似乎意味着它有一个vtable,没有别的。
答案 1 :(得分:6)
C ++有一种称为“空基优化”的东西。如果一个类没有成员,则在将它用作基类时不需要占用空间。为什么这很重要的一个例子是std::unary_function<T, U>
。它的存在是为您提供一组简单的typedef。那些typedef不应该影响你的仿函数类的大小。
如果你有一个带有vtable指针的基类,那么这个指针很可能与派生类共享。您只需为派生类创建一个vtable,它在基类之后添加自己的方法。
您现在可以实现类似的“无额外开销”基类。显然,海湾合作委员会称“几乎是空的”。
答案 2 :(得分:4)
C++ ABI提供了“几乎空”类的定义,以及它们如何影响vtable构造的有趣讨论:
包含虚拟指针的类,但除了(可能)虚拟基础之外没有其他数据。特别是:
- 除零宽度位域外没有非静态数据成员
- 没有直接的基类,它们既不是空的,也不是空的,或者是虚拟的,
- 最多只有一个非虚拟,几乎为空的直接基类,
- 没有适当的基类,它是空的,不是道德虚拟的,并且在零以外的偏移处。
我在研究几乎空的虚拟基础对对象大小,vtable大小和虚拟呼叫开销的影响时遇到了这个问题。
答案 3 :(得分:3)
它只有一个vtable,没有数据字段。