如何存储类属性/字段

时间:2015-07-21 07:57:11

标签: java c++ class alignment padding

我知道这个 C ++ 类的实例:

class A {
   char c;
   int iiii;
   short ss;   
};

在内存中看起来有点像这样:c| | | |i|i|i|i|s|s| | |

这个4/2字母的注释毫无意义(但我认为我的观点很清楚)

1 byte for char3 bytes of padding4 bytes of int2 bytes for the short2 bytes of tail padding(取决于平台,但不会改变逻辑)

来自C ++标准(编译器不会改变我示例中字段的顺序):

  

具有相同访问权限的(非联合)类的非静态数据成员   控制(第11条)被分配,以便后来的成员有更高的   类对象中的地址。非静态分配的顺序   具有不同访问控制的数据成员未指定(第11条)。   实现对齐要求可能会导致两个相邻成员   不要在对方之后立即分配;可能   管理虚拟功能的空间要求(10.3)和   虚基类(10.1)。

所以,我想知道Java类是否相同,编译器是否可以更改顺序以减少填充?

1 个答案:

答案 0 :(得分:1)

首先查看What do Java objects look like in memory during run-time? Know Thy Java Object Memory Layout

但我想Java Objects Memory Structure会回答你的问题。

  

为了节省一些内存,Sun VM没有按照声明的顺序布置对象的属性。相反,属性按以下顺序组织在内存中:

doubles and longs
ints and floats
shorts and chars
booleans and bytes
references