什么是“近空”类?

问题描述 投票:0回答:4

编译以下类

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++ gcc abstract-base-class
4个回答
7
投票

C++ 有一种叫做“空基优化”的东西。如果一个类没有成员,那么它作为基类时不需要占用空间。

std::unary_function<T, U>
可以说明为什么这一点很重要。它的存在是为了向您提供一组简单的类型定义。这些 typedef 不应该影响函子类的大小。

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

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


6
投票

我想这是为了将它与“空”区分开来,“空”是编译一个根本没有成员的类时得到的结果。 “几乎为空”似乎意味着它有一个 vtable 而没有其他东西。


4
投票

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

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

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

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


3
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.