为什么空类8个字节和更大的类总是> 8个字节?

jsm*_*dnq 7 d

class foo { }

writeln(foo.classinfo.init.length); // = 8 bytes
Run Code Online (Sandbox Code Playgroud)
class foo { char d; }

writeln(foo.classinfo.init.length); // = 9 bytes
Run Code Online (Sandbox Code Playgroud)

d实际上是在那8个字节中存储任何东西,如果是,那么什么?这似乎是一个巨大的浪费,如果我只是包装一些值类型,那么该类显着膨胀程序,特别是如果我使用了很多.char变为8倍,而int变为3倍.

struct的最小大小为1个字节.

dea*_*nix 9

在D中,对象有一个包含2个指针的标题(因此根据您的体系结构,它可能是8字节或16字节).

第一个指针是虚方法表.这是一个由填充了函数指针的编译器生成的数组,因此可以进行虚拟调度.同一类的所有实例共享相同的虚方法表.

第二个指针是监视器.它用于同步.它不确定这个字段永远留在这里,因为D强调本地存储和不变性,这使得许多对象上的同步变得毫无用处.由于此字段比这些功能旧,它仍然在这里并且可以使用.但是,它可能会在未来消失.

对象上的这种标题非常常见,例如,您可以在Java或C#中找到相同的标题.您可以在此处查看更多信息:http://dlang.org/abi.html


Vla*_*eev 9

D在每个类实例中使用两个机器单词:

  1. 指向虚函数表的指针.它包含虚拟方法的地址.第一个入口指向类的classinfo,动态强制转换也使用它.

  2. 此处synchronized(obj)记录允许语法的监视器.

这些字段在此处的D文档(向下滚动到"类属性")和此处(向下滚动到"类")中进行了描述.