【问题标题】:What is a "nearly-empty" class?什么是“近乎空”的班级?
【发布时间】:2010-11-12 06:48:14
【问题描述】:

编译下面的类

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)

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

【问题讨论】:

  • 不相关,但是..不要让虚拟析构函数像您提供的实现那样纯虚拟。
  • 我不认为这是一个特别好的建议。纯虚析构函数是表示类是抽象类的常用简写,它们必须有一个实现。
  • @Naveen:为什么不呢?任何纯虚函数都可以有一个实现。
  • ...并且析构函数必须有一个实现。

标签: c++ gcc abc


【解决方案1】:

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

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

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

【讨论】:

  • 听起来很有道理。你有参考来确认吗?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2023-03-14
        • 2011-09-09
        • 1970-01-01
        • 1970-01-01
        • 2020-05-15
        • 2018-09-07
        • 1970-01-01
        • 2018-05-20
        相关资源
        最近更新 更多