java - 一字节 boolean 值。为什么?

标签 java c++ performance boolean primitive

在 C++ 中,为什么 bool 需要一个字节来存储 true 或 false,而只有一位就足够了,比如 0 表示 false,1 表示 true? (为什么Java也需要一个字节?)

其次,使用下面的安全多少?

struct Bool {
    bool trueOrFalse : 1;
};

第三,即使是安全的,上面的野外技术真的有用吗?因为我听说我们在那里节省了空间,但编译器生成的访问它们的代码仍然比生成的访问原语的代码更大更慢。

最佳答案

Why does a bool require one byte to store true or false where just one bit is enough

因为 C++ 中的每个对象都必须是可单独寻址的*(也就是说,您必须能够拥有指向它的指针)。您无法解决单个位(至少不能在传统硬件上)。

How much safer is it to use the following?

它是“安全的”,但效果并不大。

is the above field technique really going to help?

不,出于与上述相同的原因;)

but still compiler generated code to access them is bigger and slower than the code generated to access the primitives.

是的,这是真的。在大多数平台上,这需要访问包含字节(或 int 或其他),然后执行位移和位掩码操作以访问相关位。


如果您真的担心内存使用情况,可以使用 std::bitset在 C++ 或 BitSet 中在 Java 中,打包位。


* 有少数异常(exception)。

关于java - 一字节 boolean 值。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14220726/

相关文章:

c - 为什么循环顺序会影响二维数组迭代时的性能?

java - 编译时和运行时的向下转换/向上转换错误?

java - 尝试在 Xoom(Android 3.0)中从我的应用程序打开 Word 文档,但得到 "Unknown Source"

java - Spring Query By Example 使用 "OR"

c++ - 有没有办法查看每个线程进程的虚拟内存使用情况?

c++ - 为什么结构体的 sizeof 不等于每个成员的 sizeof 之和?

c++ - 将目录添加到不带CMakeLists.txt的CMake项目中

java - 来自守护进程 : mkdir/var/lib/docker/overlay2 的错误响应

php - 存储 PHP 数组的首选方法(json_encode 与序列化)

c# - PCap性能