我知道这个 C ++ 类的实例:
class A {
char c;
int iiii;
short ss;
};
在内存中看起来有点像这样: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类是否相同,编译器是否可以更改顺序以减少填充?
答案 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