D类的开销

时间:2012-07-28 19:45:09

标签: class d overhead

我以为我听说D类有两个单词(2 void *)的开销而不是C ++所需的一个单词。我还听说vtable布局与C ++不兼容。我记得没错吗?如果是的话,这些决定的理由是什么?

2 个答案:

答案 0 :(得分:6)

一些事情:

  1. 在C ++中,没有虚函数的类将具有开销。
  2. 在D中,类始终从Object继承虚拟函数,因此它始终具有__vptr开销,但也有__monitor,C ++类对象不会有。
  3. 在C ++和D中,类实现的每个接口都会有额外的vptr
  4. vtable布局与C ++不兼容,因为D包含指向TypeInfo实例的指针,该实例具有关于类的运行时类型信息。 C ++显然没有这个,所以它是不兼容的。

答案 1 :(得分:4)

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

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