我知道这个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类是否是相同的,编译器可以改变顺序来减少填充吗?
发布于 2015-07-22 09:45:30
首先来看一下在运行时,Java对象在内存中的样子是什么?和了解您的Java对象内存布局。
但我想Java对象内存结构回答了你的问题。
为了节省一些内存,Sun没有按照声明对象的顺序排列对象的属性。相反,属性是按以下顺序在内存中组织的: 双倍和长整数,浮点数,短路和字符,布尔和字节引用
https://stackoverflow.com/questions/31533360
复制相似问题