1

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

4

2 回答 2

6

一些东西:

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

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

于 2012-07-29T09:45:12.610 回答
4

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

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

于 2012-07-28T20:35:33.837 回答