为什么布尔数据类型需要8位?

时间:2014-01-06 10:51:08

标签: java

布尔数据类型仅计算为truefalse,因此它总是只占用一位内存。那么为什么需要额外的7位内存,这不是浪费内存吗?

5 个答案:

答案 0 :(得分:13)

我认为它可能需要超过8 bits。这取决于JMV。"在Oracle JVM原语boolean需要8位,原因是支持有限且缺乏优化

另请阅读:What is the size of a boolean variable in Java?

The Java Tutorials - Primitive Data Types之后

  

boolean :布尔数据类型只有两个可能的值:true和false。将此数据类型用于跟踪真/假条件的简单标志。此数据类型代表一位信息,但其大小"大小"不是精确定义的东西

The Java® Virtual Machine Specification之后

  

虽然Java虚拟机定义了一个布尔类型,但只有提供   对它的支持非常有限。仅没有Java虚拟机指令   致力于布尔值的操作。相反,Java中的表达式   对布尔值进行操作的编程语言被编译为使用值   Java虚拟机int数据类型。

     

在Oracle的Java虚拟机实现中,Java中的布尔数组   编程语言编码为Java虚拟机字节数组,使用8位   布尔元素

例如Boolean类型在内存中看起来像这样

header:   8 bytes 
value:    1 byte 
padding:  7 bytes
------------------
sum:      16 bytes

作为boolean[]的替代方案,您可以使用java.util.BitSet

为什么很难将布尔值存储为1位?阅读Vlad from Moscow answer。你不能解决一点内存。

答案 1 :(得分:5)

取决于内存的可寻址性。最不可寻址的单位是字节。您可以获取一个字节的地址并使用它进行地址算术运算。此外,还有内置的机器命令,可以使用字节操作。但是,不可能取一点地址并执行地址算术。在任何情况下,首先你必须计算包含目标位的字节的地址,并应用额外的机器命令,这些命令取决于设置或重置该位的字节中位的位置。

答案 2 :(得分:3)

请参阅Oracle’s Java Virtual Machine implementation

  

虽然Java虚拟机定义了一个布尔类型,但它只是   为它提供非常有限的支持。没有Java Virtual   机器指令仅专用于布尔值的操作。   而是在Java编程语言中运行的表达式   编译布尔值以使用Java虚拟机的值   int数据类型。


  

Java虚拟机使用1来编码布尔数组组件   表示true,0表示false。哪里有Java编程   语言布尔值由编译器映射到Java的值   虚拟机类型为int,编译器必须使用相同的编码。

答案 3 :(得分:1)

您可以看到对此处使用的实际尺寸的讨论:

What is the size of a boolean variable in Java?

但基本上它归结为内存效率和性能之间的权衡 - 特别是当你考虑到类中的每个其他变量都需要开始字对齐时。

只有当您要打包多个较小的对象时才能将它们打包得更小,然后您仍然需要留下填充以对齐下一个成员。

答案 4 :(得分:0)

  

这不是浪费记忆吗?

是的,它浪费了7位,但是我们每个人都知道一个字节是最小的存储单元,JVM认为它是1个字节。