如何存储类属性/字段

Oth*_*oun 8 c++ java class alignment padding

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

class A {
   char c;
   int iiii;
   short ss;   
};
Run Code Online (Sandbox Code Playgroud)

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

这个4/2字母注释没有任何意义(但我认为我的观点很明确)

1 byte for char,3 bytes of padding,4 bytes of int,2 bytes for the short,和2 bytes of tail padding (依赖于平台的,但它不会改变逻辑)

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

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

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

Ber*_*ach 1

首先看看Java对象在运行时在内存中是什么样子的?了解您的 Java 对象内存布局

但我想Java 对象内存结构回答了你的问题。

为了节省一些内存,Sun VM 并不按照对象属性声明的顺序来排列它们。相反,属性在内存中按以下顺序组织:

doubles and longs
ints and floats
shorts and chars
booleans and bytes
references
Run Code Online (Sandbox Code Playgroud)