首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么空类总是8个字节,而更大的类总是>8个字节?

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

Stack Overflow用户
提问于 2012-12-05 19:41:47
回答 3查看 495关注 0票数 7
代码语言:javascript
复制
class foo { }

writeln(foo.classinfo.init.length); // = 8 bytes
代码语言:javascript
复制
class foo { char d; }

writeln(foo.classinfo.init.length); // = 9 bytes

D实际上是将任何东西存储在这8个字节中吗?如果是的话,什么?这似乎是一种巨大的浪费,如果我只是包装了几个值类型,那么这个类会显着地膨胀程序,特别是如果我使用了大量的值类型。一个字符变大8倍,而int变得3倍大。

结构的最小大小是1字节。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-05 20:19:50

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

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

第二个指针是监视器。它用于同步。不确定这个领域是否永远存在,因为D强调本地存储和不变性,这使得许多对象上的同步毫无用处。由于这个字段比这些特性更老,所以它仍然在这里,可以使用。然而,它可能会在未来失去作用。

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

票数 9
EN

Stack Overflow用户

发布于 2012-12-05 20:19:54

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

  1. 指向虚拟函数表的指针。这包含虚拟方法的地址。第一个入口点指向类的类信息,动态强制转换也使用它。
  2. 允许使用synchronized(obj)语法的监视器记录了这里

这些字段在D文档这里 (向下滚动到“类属性”)和这里 (向下滚动到“类”)中进行了描述。

票数 9
EN

Stack Overflow用户

发布于 2012-12-05 19:50:57

您应该研究各种类型的存储需求。每条指令、存储分配(例如:变量/对象等)都占用了特定的空间。在c#中,Int32类型的整数对象应该存储4字节(32位)的整数信息。它也可能有其他信息,因为它是一个对象,但是字符数据类型可能只需要1字节的信息。如果您有类似for或时类的构造,那么这些东西也会占用空间,因为其中的每一件事都告诉您的类做一些事情。类本身需要在内存中创建大量指令,这将占8个初始字节。

参加汇编语言课程。您将了解所有您想知道的内容,然后了解程序在编译时使用多少内存或占用多少存储空间的原因。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13731112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档