我听说D类有两个单词(2个void*)的开销,而不是C++所需的一个单词。我还听说vtable布局与C++不兼容。我记对了吗?如果是,做出这些决定的理由是什么?
几件事:
- 在C++中,没有虚拟函数的类将有零开销
- 在D中,类总是从
Object
继承虚拟函数,所以它总是有__vptr
的开销,但也有一个__monitor
,而C++类对象没有 - 在C++和D中,类实现的每个接口都将有额外的
vptr
vtable布局与C++不兼容,因为D包含指向TypeInfo
实例的指针,该实例具有有关类的运行时类型信息。C++显然没有,所以它是不兼容的。
额外的指针指向同步类的监视器对象(显然有人讨论过为未同步类删除它,但这并没有发生)。布局记录在规范的ABI部分
我不确定vtable布局与C++编译器的不同之处。其他人可能会回答这个问题。