在搜索这是否已经回答时,我发现类成员是否保证在内存中是连续的?,但这涉及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 虚拟机不要求对对象使用任何特定的内部结构。
实际上,您可能会猜到类实例的主体是单个内存,但这仍然留下了对齐,填充和排序或成员的问题(没有理由保持我可以看到的源代码顺序,以及一些重新排序的理由)。
- 1 回答
- 0 关注
- 87 浏览
添加回答
举报
0/150
提交
取消