class foo { }
writeln(foo.classinfo.init.length); // = 8 bytesclass foo { char d; }
writeln(foo.classinfo.init.length); // = 9 bytesD实际上是将任何东西存储在这8个字节中吗?如果是的话,什么?这似乎是一种巨大的浪费,如果我只是包装了几个值类型,那么这个类会显着地膨胀程序,特别是如果我使用了大量的值类型。一个字符变大8倍,而int变得3倍大。
结构的最小大小是1字节。
发布于 2012-12-05 20:19:50
在D中,对象有一个包含2个指针的标头(根据您的体系结构,它可能是8字节或16字节)。
第一个指针是虚拟方法表。这是一个由函数指针填充的编译器生成的数组,因此虚拟调度是可能的。同一个类的所有实例共享相同的虚拟方法表。
第二个指针是监视器。它用于同步。不确定这个领域是否永远存在,因为D强调本地存储和不变性,这使得许多对象上的同步毫无用处。由于这个字段比这些特性更老,所以它仍然在这里,可以使用。然而,它可能会在未来失去作用。
对象上的此类头非常常见,例如,您可以在Java或C#中找到相同的信息。您可以在这里查找更多信息:http://dlang.org/abi.html
发布于 2012-12-05 20:19:54
D在每个类实例中使用两个机器单词:
synchronized(obj)语法的监视器记录了这里。这些字段在D文档这里 (向下滚动到“类属性”)和这里 (向下滚动到“类”)中进行了描述。
发布于 2012-12-05 19:50:57
您应该研究各种类型的存储需求。每条指令、存储分配(例如:变量/对象等)都占用了特定的空间。在c#中,Int32类型的整数对象应该存储4字节(32位)的整数信息。它也可能有其他信息,因为它是一个对象,但是字符数据类型可能只需要1字节的信息。如果您有类似for或时类的构造,那么这些东西也会占用空间,因为其中的每一件事都告诉您的类做一些事情。类本身需要在内存中创建大量指令,这将占8个初始字节。
参加汇编语言课程。您将了解所有您想知道的内容,然后了解程序在编译时使用多少内存或占用多少存储空间的原因。
https://stackoverflow.com/questions/13731112
复制相似问题