Burence Asked:2020-02-09 07:39:08 +0000 UTC2020-02-09 07:39:08 +0000 UTC 2020-02-09 07:39:08 +0000 UTC 布尔大小 772 对于除 type 之外的所有原始数据类型boolean,Java 都有一个唯一定义的大小。 类型的大小boolean,据我了解,取决于特定虚拟机的实现。 问题:为什么boolean没有明确确定类型的大小? java 3 个回答 Voted Best Answer user181100 2020-02-09T08:24:36Z2020-02-09T08:24:36Z 做什么的?语言不应该关心这个。 如果行为是唯一定义的,其他一切都是次要的。 一个类型boolean由它的一组有效值完美地定义。从数学上讲,它将最小值大小限制为一位。 但是只使用一个位(而不是更多)远非总是有效,因为在流行的体系结构上不可能对单个位进行寻址。因此,单个的值boolean不能快速存储在 RAM 的单个位中 - 必须使用按位运算的组合,这几乎肯定比将整个单个寄存器写入 RAM 慢(其大小可能因不同而异)平台!)。 但与此同时,例如,我完全可以想象在 x86 上编译器如何将标志寄存器boolean的一位用作本机代码中的特定值,前提是该值永远不会进入 RAM(与其他值分开)。因此,对多于一位的大小的任何限制也可能会造成干扰。 这种表示的自由允许 JVM 作者在任何特定上下文中使用他们认为最有效的任何实现。从上面的示例中可以看出,任何限制只会成为阻碍。 Barmaley 2020-02-09T15:10:11Z2020-02-09T15:10:11Z 是的,你确实是对的。JVM 规范- 没有定义类型大小boolean: 尽管 Java 虚拟机定义了一个 boolean 类型,但它只提供了非常有限的支持。没有专门用于布尔值操作的 Java 虚拟机指令。相反,Java 编程语言中对布尔值进行运算的表达式被编译为使用 Java 虚拟机 int 数据类型的值。 在圣人 James Gosling创建的第一版 JVM 规范中,boolean它根本就不是一个类型: 尽管 Java 定义了布尔类型,但 Java 虚拟机没有专门用于对布尔值进行操作的指令。相反,对布尔值进行操作的 Java 表达式被编译为使用 int 数据类型来表示布尔变量。 我相信这样做是为了在速度和便利性之间取得平衡。也就是单个类型boolean被当做int,数组当做数组byte,有的地方甚至当成位 Rostislav Dugin 2020-02-09T08:02:49Z2020-02-09T08:02:49Z 正如您所说,一切都取决于JVM的特定实现,以及为什么 - 我不知道,当我搜索时,我也没有找到答案。但是,这里有一些信息可能仍然有用(取自此处): 在Sun JVM和Oracle HotSpot JVM的标准实现中,类型boolean占用 4 个字节(32 位),就像int. 但是,在某些版本的JVM中,存在布尔数组中的每个值占用 1 位的实现。 还有一些库可以减少布尔值的大小:BitSet和OpenBitSet(来自Apache)。Habr的逐字引述: 这种情况下的救星是 BitSet 类,它的行为类似于布尔数组,但对数据进行打包,以便只为一位分配一位内存(整个数组的开销很小)。BitSet内部存储了一个long类型的数组,在请求或设置某位的值时,计算出想要的long的索引,通过按位和移位运算,对单个位进行计算。BitSet 有一个更有趣的实现,OpenBitSet——用于 Lucene 的 Apache 实现。它要快得多,但它遗漏了对原始 BitSet 所做的一些检查。使用什么取决于你。
做什么的?语言不应该关心这个。
如果行为是唯一定义的,其他一切都是次要的。
一个类型
boolean由它的一组有效值完美地定义。从数学上讲,它将最小值大小限制为一位。但是只使用一个位(而不是更多)远非总是有效,因为在流行的体系结构上不可能对单个位进行寻址。因此,单个的值
boolean不能快速存储在 RAM 的单个位中 - 必须使用按位运算的组合,这几乎肯定比将整个单个寄存器写入 RAM 慢(其大小可能因不同而异)平台!)。但与此同时,例如,我完全可以想象在 x86 上编译器如何将标志寄存器
boolean的一位用作本机代码中的特定值,前提是该值永远不会进入 RAM(与其他值分开)。因此,对多于一位的大小的任何限制也可能会造成干扰。这种表示的自由允许 JVM 作者在任何特定上下文中使用他们认为最有效的任何实现。从上面的示例中可以看出,任何限制只会成为阻碍。
是的,你确实是对的。JVM 规范- 没有定义类型大小
boolean:在圣人 James Gosling创建的第一版 JVM 规范中,
boolean它根本就不是一个类型:我相信这样做是为了在速度和便利性之间取得平衡。也就是单个类型
boolean被当做int,数组当做数组byte,有的地方甚至当成位正如您所说,一切都取决于JVM的特定实现,以及为什么 - 我不知道,当我搜索时,我也没有找到答案。但是,这里有一些信息可能仍然有用(取自此处):
在Sun JVM和Oracle HotSpot JVM的标准实现中,类型
boolean占用 4 个字节(32 位),就像int. 但是,在某些版本的JVM中,存在布尔数组中的每个值占用 1 位的实现。还有一些库可以减少布尔值的大小:BitSet和OpenBitSet(来自Apache)。Habr的逐字引述: