【发布时间】:2013-12-24 03:21:57
【问题描述】:
如果我在一个类中需要 8 个布尔成员变量,Java 是否有效地将它们全部放在一个字节中?或者它会为每个使用一个字节?换句话说,内存占用是否不同:
boolean a;
boolean b;
boolean c;
boolean d;
boolean e;
boolean f;
boolean g;
boolean h;
对比
public static final int a = 0x01;
public static final int b = 0x02;
public static final int c = 0x04;
public static final int d = 0x08;
public static final int e = 0x10;
public static final int f = 0x20;
public static final int g = 0x40;
public static final int h = 0x80;
byte flags;
我问是因为我将实例化 很多 这些对象。所以让它占用 1 个字节而不是 8 个字节的内存将是一个显着的节省。
更新:这绝对类似于列出布尔值存储在 int 中的链接问题(感谢您提供这些链接,抱歉在询问之前我没有找到它们)。这个问题有点不同,因为它提出了使用字节和位标志的具体替代方案。我不知道这是否足以使这个问题不再重复。
更新 2: 我刚刚使用 SizeofUtil 运行了它,发现以下内容。 8 个布尔值需要 24 个字节/对象或 3 个字节/布尔值。单字节方法需要 10 个字节/对象。我会理解 8 它将一个字节扩展为本机 int (我在 64 位系统上)。但是另外 2 个字节是怎么回事?
【问题讨论】:
-
我敢打赌,在 64 位机器上,它会将它们分开 8 个字节。但这取决于JVM。在内存方面浪费,但在性能方面却没有。
-
是的,效率更高
-
出于不言自明的原因,
boolean必须是保存布尔值以满足通常要求的最佳数据结构;否则将使用其他东西。我有一种感觉,通常的要求可能是以牺牲内存为代价的访问速度。你想牺牲访问速度吗? -
Boolean 只是 JLS 的 定义 中的 最佳 类型。在速度方面,boolean 在 VM 的实现中有一些怪癖,这使得它可能慢比 uning 一个完整的 int 用于相同的目的(使用 C 风格的非零 == TRUE) .布尔值的问题在于,它们几乎不可避免地需要在代码中引入分支的字节码(例如,实现“boolean b = x == y”,其中 c-style 可以说“int b = x - y”)。您可以使用 javap 进行检查。
标签: java