在Java中,类的所有成员都存储在连续内存中吗?



在搜索是否已经回答时,我发现类成员是否保证在内存中是连续的?

提供上下文,我有Go的背景,我正在学习Java。我知道,与Go,我可以写一个结构使用指针像这样:

type myStruct struct {
firstMember  *string
secondMember *int
}

但是在详细学习Go时,我经常读到这是一个坏主意,除非你真的需要它们是指针,因为这意味着每个成员的值可以在动态内存中传播到任何地方,这会损害性能,因为它不能利用CPU的空间局域性。

相反,通常建议这样写结构体,不使用指针:

type myStruct struct {
firstMember  string
secondMember int
}

当我学习如何有效地编写Java时,我很好奇当我使用Java时,我的工具集中是否有相同的工具。因为我没有能力使用指针(因为每个类型是类的变量都是对该类的引用,实际上是指针),所以我只能使用Stringint来编写类:

class MyClass {
String firstMember;
int secondMember;
}

意识到这是为我的数据结构编写类的唯一方法,这使我想到了所提出的问题。

但是在详细学习围棋时,我经常读到这是一个坏消息除非你真的需要它们作为指针,因为这意味着每个成员的值可以分布在动态内存中的任何地方,这会影响性能,因为它无法被利用

在Java中你没有选择。

class MyClass {
String firstMember;
int secondMember;
}

string值成员是且只能是引用(即实际上是指针)。整型成员是一个基本值(即不是指针)。

Java世界分为原始值和对象(某些类或数组等)。前一种类型的变量不是引用,后一种类型的变量是引用。

Java语言规范根本没有讨论对象布局;这不是语言中出现的概念。

JVM规范明确规定

Java虚拟机没有强制任何特定的内部

实际上,您可能会猜测类实例的主体是一块内存,但这仍然留下了对齐、填充和成员排序的问题(没有理由保持我可以看到的源代码顺序,并且有一些理由重新排序)。

最新更新