Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中,成员顺序是否会像在C或C+中那样产生性能差异+;? 在C和C++中,编译器不允许重新排序结构的数据成员,所以如果你不小心如何排序它们,那么你就浪费了空间。例如: struct S { int i; void *p; int i2; };_Java_Optimization_Bytecode - Fatal编程技术网

在Java中,成员顺序是否会像在C或C+中那样产生性能差异+;? 在C和C++中,编译器不允许重新排序结构的数据成员,所以如果你不小心如何排序它们,那么你就浪费了空间。例如: struct S { int i; void *p; int i2; };

在Java中,成员顺序是否会像在C或C+中那样产生性能差异+;? 在C和C++中,编译器不允许重新排序结构的数据成员,所以如果你不小心如何排序它们,那么你就浪费了空间。例如: struct S { int i; void *p; int i2; };,java,optimization,bytecode,Java,Optimization,Bytecode,在具有32位ints和64位指针的平台上,将首先放置i,然后是32位的填充,以便p可以64位对齐i2然后占据下一个单词的一半,然后是另一个32位的填充。结果结构的长度为24字节,而如果先声明p,则只有16字节长。如果数组中有很多这样的结构,查找和删除填充有时是一项重要的优化,以节省内存并减少缓存流失 我很想知道Java是否有相同的特性。未装箱类型(如int和boolean)是否与引用大小相同或更小?如果它们较小,编译器是否允许对它们重新排序以避免插入填充以对齐后续字段?最后,如果是的话,有没有编

在具有32位
int
s和64位指针的平台上,将首先放置
i
,然后是32位的填充,以便
p
可以64位对齐
i2
然后占据下一个单词的一半,然后是另一个32位的填充。结果结构的长度为24字节,而如果先声明
p
,则只有16字节长。如果数组中有很多这样的结构,查找和删除填充有时是一项重要的优化,以节省内存并减少缓存流失

我很想知道Java是否有相同的特性。未装箱类型(如
int
boolean
)是否与引用大小相同或更小?如果它们较小,编译器是否允许对它们重新排序以避免插入填充以对齐后续字段?最后,如果是的话,有没有编译器可以这样做


我现在对此没有特别的优化需求,我只是想知道在选择字段的声明顺序时是否应该记住这一点,就像我在C中所做的那样。

在java中存在这样的问题。编译器处理变量声明,程序员无法控制在内存中的何处分配它们

Java没有结构,只有类。java中的C++类并不一定意味着类也在C++后端。您甚至不知道JVM是否是用C/C++实现的。它可以用任何其他语言表达

但是对于C++ JVM,我认为他们试图优化。基本类型(不称为unbox)类型,如int或boolean,通常映射到它们的基本对应类型(就我的JNI经验而言),但由于没有结构,它们不需要排列


我几乎可以肯定,重新设置类字段不会对内存消耗产生任何影响。仅仅因为它们不映射到结构。

int
类型始终是32位的,即使在64位JVM中,引用通常也是32位的

另一方面,Java在每个对象的开头有一个8-12字节的头,并使用8字节对齐。BTW一些C++环境有16字节对齐。 未绑定类型(如int和boolean)与引用的大小相同还是更小

对于boolean、byte、char和short,您可以期望它们更小,但是对于long和double,原语可以更大,而不是引用

如果它们较小,编译器是否允许对它们重新排序以避免插入填充以对齐后续字段

JIT可以重新组织字段,甚至优化字段

最后,如果是的话,有没有编译器可以这样做

javac
编译几乎没有进行任何优化,查看字节码将为您提供运行时将发生什么的一些线索。JIT可以选择任何方式优化对象中的字段

我只是想知道,在选择字段的声明顺序时,是否应该像在C中那样记住这一点

恕我直言,您可以假设,您可能在C中使用的每一个优化技巧都不再适用于Java。在少数几个这样做的人中,他们可能并不完全相同


您应该假设JIT将根据需要优化代码,并使用探查器确定是否以及何时出现问题。只有考虑性能的原因来改变代码。正如其他人指出的,

< P>,您确实无法控制java中的这种细节级别。然而,如果您真的需要对内存进行如此多的控制,您可以通过将其索引到byte[]中,甚至直接索引到堆外来管理它

我不想要那种程度的控制。我只是想知道编译器和JVM是否会做正确的事情,或者他们是否需要程序员的帮助。