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

有帮助吗?

解决方案

一些东西:

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

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

其他提示

额外的指针是同步类的监视器对象(显然已讨论删除未同步类但尚未发生的讨论)。该布局记录在 abi部分的规范。

我不确定vTable的布局如何与C ++编译器如何进行。其他人可能会回答这个问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top