【问题标题】:Overhead of D classesD类的开销
【发布时间】:2012-07-27 02:16:34
【问题描述】:

我想我听说 D 类有两个字 (2 void*) 的开销,而不是 C++ 要求的一个字。我还听说 vtable 布局与 C++ 不兼容。我记错了吗?如果是这样,这些决定的理由是什么?

【问题讨论】:

  • 没有必要被“听到” - 来源在那里,你自己去看看。 :)
  • 如果那是你的事,克隆 git repos 并花费数小时费解超过 100,000 行的源代码,希望找到一个简单问题的答案,当然。至于我,我会问是否有人已经知道答案:)

标签: class d overhead


【解决方案1】:

一些事情:

  1. 在 C++ 中,没有虚函数的类将有开销。
  2. 在 D 中,类总是从 Object 继承虚函数,因此它总是有 __vptr 开销,但也有 __monitor,这是 C++ 类对象所没有的。
  3. 在 C++ 和 D 中,类实现的每个接口都会有额外的vptr

vtable 布局与 C++ 不兼容,因为 D 包含指向 TypeInfo 实例的指针,该实例具有有关类的运行时类型信息。 C++ 显然没有,所以不兼容。

【讨论】:

  • 值得一提的是,您可以使用 extern(C++) 来构建兼容的 vtable。或许也应该说,在不需要开销的情况下可以使用 D 中的结构。
  • 好吧,我当然希望 D 开发人员改变这个实现。为什么非同步类会有“__monitor”?此外,虽然 C++ 类不会有这个 TypeInfo 东西,但这并不一定要阻止 C++ 调用 D 虚函数,反之亦然:只需将 TypeInfo 放在不会妨碍它的 vptr[-1] 处。一直在谈论从 Object 中消除 opCmp、opEqual 等;希望他们会考虑在同一时间添加 C++ 二进制兼容性,至少对于简单的情况是这样。 (是的,有 extern(C++),但是默认兼容的缺点是什么?)
  • 基本上,如果您发送的垃圾邮件数量足以让四个字节产生影响,那么您的设计就会出现问题。 D 具有用于 POD 类型的结构。另外:C++ 本身对于向后兼容性的缺点难道不是足够的教训吗?
  • 必须同意@FeepingCreature,如果这 4 或 8 个字节确实有所作为,那么您可能创建了太多的类实例来开始。利用批量效率并将多个实例合并为一个。
【解决方案2】:

额外的指针指向同步类的监视器对象(显然已经讨论过为非同步类删除它,但没有发生)。布局记录在规范的ABI section 中。

我不确定 vtable 布局与 C++ 编译器的做法有何不同。其他人可能会回答这个问题。

【讨论】:

  • 只是澄清一下,您可以通过使用结构和使用alias this 来模拟继承,从而在 D 中获得零开销的不带虚函数的对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-20
  • 2014-10-03
  • 1970-01-01
  • 2013-07-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多