4

在我看来,对于像bool. 明确告诉所有bools 只使用 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;

};

编辑:

我知道不可能获取字段的地址。还有其他缺点吗?

4

3 回答 3

6

If you have LOTS of these things, it saves space. But it does add at least an extra AND or OR instruction for each clear/set/check operation over the normal one-byte solution.

In the whole scheme of things, unless you actually have a HUGE number, there is probably no benefit.

于 2013-08-15T09:21:56.147 回答
3

有时间/空间/同步的权衡。

显然,您可以在同一空间中存储 32 倍的位。

但是,要访问单个布尔值,您至少需要一个屏蔽操作,并且可能需要一个转变(尽管在某些情况下,这可能会被优化掉)。

如果多个控制线程尝试修改布尔值,则会产生后果,因为您已将更新的简单写入更改为读取/修改/写入,因此现在您必须添加同步。

于 2013-08-15T09:41:28.103 回答
2

我遇到了几个很好的编译器/架构/函数,其中将布尔值移动到位域中极大地提高了代码质量和性能。

不幸的是,GCC 不是那些编译器之一(或者不是我上次测试这个)。

当一切顺利时,将多个布尔值存储在一个寄存器中可以减轻很多寄存器压力,从而消除大量寄存器溢出到堆栈并使其余代码更加高效。

如果架构具有足够的位处理指令集,那么测试和操作操作可以与从整个寄存器或更糟的堆栈中提取布尔值的可比操作一样紧凑或更紧凑。

通常(即使在 x86 上),位打包布尔值应该会产生更高效的代码,但限制是编译器。

于 2013-08-15T09:50:07.490 回答