对象的实例变量是否存储在连续内存中
Are the instance variables for an object stored in continguous memory
对象的实例变量是否像数组中的元素一样存储在连续内存中?假设您有 Student class def,它具有名称、年龄和年级实例变量。 Studentclass构造实例时,实例变量是否存储在连续内存中?
总的来说,答案是肯定的;但这是未指定的。有一个库 specifically designed for this,您可以使用它。
例如 class 比如:
static class Example {
byte b = 1;
int x = 3;
long l= 12;
}
你可以看到它的布局(通过ClassLayout.parseClass(Example.class).toPrintable()
):
Example object internals:
OFFSET SIZE TYPE DESCRIPTION VALUE
0 12 (object header) N/A
12 4 int Example.x N/A
16 8 long Example.l N/A
24 1 byte Example.b N/A
25 7 (loss due to the next object alignment)
Instance size: 32 bytes
Space losses: 0 bytes internal + 7 bytes external = 7 bytes total
注意字段如何改变它们的位置(以减少填充),以及有一个 7 字节填充的事实。
你越深入地研究,事情就会变得越来越有趣,例如继承,或者由其他对象构成的对象。该库中的示例以这种方式非常丰富。
对象的实例变量是否像数组中的元素一样存储在连续内存中?假设您有 Student class def,它具有名称、年龄和年级实例变量。 Studentclass构造实例时,实例变量是否存储在连续内存中?
总的来说,答案是肯定的;但这是未指定的。有一个库 specifically designed for this,您可以使用它。
例如 class 比如:
static class Example {
byte b = 1;
int x = 3;
long l= 12;
}
你可以看到它的布局(通过ClassLayout.parseClass(Example.class).toPrintable()
):
Example object internals:
OFFSET SIZE TYPE DESCRIPTION VALUE
0 12 (object header) N/A
12 4 int Example.x N/A
16 8 long Example.l N/A
24 1 byte Example.b N/A
25 7 (loss due to the next object alignment)
Instance size: 32 bytes
Space losses: 0 bytes internal + 7 bytes external = 7 bytes total
注意字段如何改变它们的位置(以减少填充),以及有一个 7 字节填充的事实。
你越深入地研究,事情就会变得越来越有趣,例如继承,或者由其他对象构成的对象。该库中的示例以这种方式非常丰富。