在我看来,对于像bool
这样的二进制变量,你只需要一点。明确告诉所有bool
仅使用1位是否是一个错误的决定?
struct Banana {
// little fields
bool on_off : 1;
bool yes_no : 1;
bool left_right : 1;
bool alive_dead : 1;
bool in_out : 1;
};
编辑:
我知道无法获取字段的地址。还有其他缺点吗?
答案 0 :(得分:6)
如果您有很多这样的东西,它可以节省空间。但它确实为正常的单字节解决方案的每个清除/设置/检查操作添加了至少额外的AND
或OR
指令。
在整个计划中,除非你真的有一个巨大的数字,否则可能没有任何好处。
答案 1 :(得分:3)
有时间/空间/同步权衡。
显然,您可以在同一空间中存储32倍的位数。
但是,要访问单个bool,您至少需要一个屏蔽操作,并且可能是一个转换(尽管在某些情况下,可能会进行优化)。
如果您将更新的简单写入更改为读取/修改/写入,则多个控制线程会尝试修改布尔值,这会产生影响,因此现在您必须添加同步。
答案 2 :(得分:2)
我遇到了一些好的编译器/体系结构/功能,将布尔值移动到位域可以极大地提高代码质量和性能。
不幸的是,GCC不是那些编译器之一(或者我上次测试时不是这样)。
当事情进展顺利时,将几个布尔值存储在一个寄存器中可以减轻很多寄存器压力,从而消除大量寄存器溢出到堆栈并使其余代码更加高效。
如果体系结构具有足够的位处理指令集,那么测试和操作操作可以比从整个寄存器或更糟糕的堆栈中提取布尔值的类似操作一样紧凑或更多紧凑。
通常(即使在x86上),位打包布尔值应该会产生更高效的代码,但是限制是编译器。