【问题标题】:Why does the boolean data type need 8 bits? [duplicate]为什么布尔数据类型需要 8 位? [复制]
【发布时间】:2014-01-23 18:17:29
【问题描述】:

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

【问题讨论】:

  • 它实际上比一个 8 位占用更多的内存 - JVM 通常使用 int 值实现布尔值。为什么这样做呢?为了更好地理解这一点,请考虑一个必须处理多个布尔值的 JVM - 如果一个布尔值仅使用一位,那么您的 JVM 将需要保持映射 variable to value byte and bit number。获取布尔值还需要执行 AND 操作(存储需要 OR)。所以将布尔值实现为完整字节(或整数)更容易
  • 是的,对我们来说是浪费内存,但对 Java 人来说是高效且不太复杂的操作码。他们不必创建特定的操作码来从内存中加载和存储布尔值
  • 标记为重复的问题有问题的答案(缺乏支持),但这里的 OP 想知道原因。这是不同的问题。

标签: java


【解决方案1】:

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

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

The Java Tutorials - Primitive Data Types之后

boolean: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。你不能解决一点内存。

【讨论】:

  • 我想这就是答案,谢谢。我会研究它
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    Oracle’s Java Virtual Machine implementation:

    虽然 Java 虚拟机定义了布尔类型,但它只 对其提供非常有限的支持。没有 Java 虚拟 专门用于对布尔值进行操作的机器指令。 取而代之的是,Java 编程语言中的表达式 布尔值被编译为使用 Java 虚拟机的值 int 数据类型。


    Java 虚拟机使用 1 对布尔数组组件进行编码到 代表真,0代表假。 Java编程在哪里 语言布尔值由编译器映射到 Java 的值 虚拟机类型int,编译器必须使用相同的编码。

    【讨论】:

      【解决方案4】:

      您可以在此处查看有关实际尺寸的讨论:

      What is the size of a boolean variable in Java?

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

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

      【讨论】:

        【解决方案5】:

        这不是浪费内存吗?

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

        【讨论】:

        • 抱歉,没听懂
        • Byte 不是最小单位,bits 也可以存储在内存中。您可以压缩数据。
        • OK bits 是最小单位。但是在这种情况下不是浪费了 7 位吗?
        • @MariuszS 对,但您不能直接寻址位。字节是内存的最小可寻址单位
        • 是的,但这不是最小的存储单元 ;)
        猜你喜欢
        • 2017-02-08
        • 2014-03-16
        • 2012-10-25
        • 2011-01-24
        • 2018-04-28
        • 1970-01-01
        • 2018-08-22
        • 2013-07-09
        • 1970-01-01
        相关资源
        最近更新 更多