为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
ibeautiful 2022-09-19 20:51:49
在搜索这是否已经回答时,我发现类成员是否保证在内存中是连续的?,但这涉及C++,而不是Java。为了提供上下文,我有围棋的背景,我正在学习Java。我知道使用Go,我可以使用这样的指针编写一个结构:type myStruct struct {     firstMember  *string     secondMember *int}但是在详细研究Go时,我经常读到这是一个坏主意,除非你真的需要它们作为指针,因为这意味着每个成员的值可以分布在动态内存中的任何位置,从而损害性能,因为它不能利用CPU中的空间局部性。相反,通常建议以这种方式编写结构,而不使用指针:type myStruct struct {     firstMember  string     secondMember int}当我学习如何有效地编写Java时,我很好奇在使用Java时我的工具集中是否有相同的工具。由于我没有能力使用指针(因为类型为类的每个变量都是对该类的引用,实际上是指针),因此我只能使用 和 编写类:Stringintclass MyClass {     String firstMember;         int secondMember; }意识到这是为我的数据结构编写类的唯一方法,因此我提出了这个问题。
查看完整描述

1 回答

?
www说

TA贡献1775条经验 获得超8个赞

但是在详细研究Go时,我经常读到这是一个坏主意,除非你真的需要它们作为指针,因为这意味着每个成员的值可以分布在动态内存中的任何位置,从而损害性能,因为它不能利用CPU中的空间局部性。

在爪哇,你别无选择。

class MyClass {  
  String firstMember;
    int secondMember;
}

字符串值成员是并且只能是引用(即,实际上是指针)。整数值成员是基元值(即,不是指针)。

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

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

JVM 规范特别指出

Java 虚拟机不要求对对象使用任何特定的内部结构。

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


查看完整回答
反对 回复 2022-09-19
  • 1 回答
  • 0 关注
  • 87 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信