在Oracle website上,它表示bool在堆栈上占32位,但在数组中占8位。我很难理解为什么他们会在一个小组中比在单打中少花钱。它们是如何存储的,它有什么区别?如果bool阵列效率更高,为什么这项技术没有转移到单身?
另外,为什么不是1位?
64但是系统和32位系统如何存储它们之间的区别是什么?
谢谢!
答案 0 :(得分:7)
布尔值可以存储为单个二进制数字,但我们的计算机将值组合为方便。实际处理的最小单位是一个字节,下一个最大的单词是一个字。在现代硬件中,字节总是8位。 32位已经成为一个单词的标准。甚至我们的64位计算机也可以有效地处理32位字。将bool存储在任何自然单元中比单个位更方便。在数组中,自然单位将是一个字节,因为您可以寻址内存中的任何字节。在堆栈上,这是一个文字堆栈,自然单位是一个单词。你可以把bool变成字节和单词,然后逐字逐句地将它们拉出来,但这比用字节或单词存储它们效率低,因为现代存储器很大,因此CPU速度更受关注。你不会浪费所有的时间来紧凑地打包,所以我们浪费了内存,因为它更容易消耗。
答案 1 :(得分:3)
由于CPU的工作方式,所有操作都以32位完成。如果你只有一个bool,编译器可以做的唯一现实的事情是将24位的其余部分清零并将其保存到堆栈中,因为扫描你的java文件以获取其他bool并存储是不切实际的它们都在相同的32位内存块中。
如果你有一系列bool,只需要用4个块来引用它们就很简单,所以每个bool只有8位。
请注意,这仅适用于32位应用程序/计算机。
答案 2 :(得分:3)
看,当谈到堆叠时,必须记住速度是最重要的。例如,请考虑以下事项:
void method(int foo, boolean bar, String name) ....
然后进入方法后的堆栈如下所示:
|-other variables-|-...-|-name-|-bar-|-foo-|---- return address etc. --
^
stack pointer
这些是字边界上的所有数量,由|
表示。当然,JVM可以(理论上,但见下文)将布尔值存储在一个字节中。但是必须记住,32位负载在没有解决字边界时可能会更慢。根据体系结构,可能无法通过不在字边界上的指针。或者在浮点指令等中使用数量可能是不可能的。
此外,字节代码格式只能寻址堆栈中的 n 字。如果不是这样,则必须以字节为单位指定相对于堆栈指针的地址,这意味着几乎任何堆栈访问都会有两个在大多数情况下无关的位,因为大多数参数都是单词(int ,浮动或参考)或双字(长,双)。
永远不可能的是将1个单位用于布尔值。为什么?因为位不能直接寻址。最小的可寻址单元是字节。
如果您觉得应该节省内存,仍然可以在 int 中存储32个布尔值。