鉴于我有一个可能处于一个或多个真/假状态的对象,我总是对模块为什么经常使用标志+位掩码而不是使用多个布尔值有点模糊。为什么使用标志+位掩码而不是一系列布尔值?
它遍布.NET框架。不知道这就是最好的例子,但在.NET框架有以下几点:
public enum AnchorStyles
{
None = 0,
Top = 1,
Bottom = 2,
Left = 4,
Right = 8
}
所以给出一个锚的风格,我们可以使用位掩码来找出哪些国家的选择。但是,您似乎可以使用为每个可能的值定义的bool属性或单个枚举值数组的AnchorStyle类/结构完成相同的操作。
当然,我的问题的主要原因是,我想知道如果我应该按照我自己的代码类似的做法。
那么,为什么要使用这种方法呢?
- 内存消耗较少? (它不是似乎喜欢它会消耗比bools的数组/结构更少)
- 比结构或数组更好的堆栈/堆性能?
- 更快的比较操作?更快的增值/删除?
- 对于编写它的开发者来说更方便吗?
不是说我发现了一个强有力的论点,但它确实消耗了更少的内存。它使用一个int(4字节),而每个布尔使用一个字节。所以,4个布尔使用相同的一个int。 32个布尔最多使用32个字节,而所有这些布尔可以使用相同的枚举。如果你去不推荐的路径,你可以使枚举长8个字节(sizeof(long))。 – 2009-09-10 17:16:41
感谢您澄清。它引导我到这篇文章:http://stackoverflow.com/questions/294905/why-in-net-system-boolean-takes-4-byte – 2009-09-10 21:38:54
所以从响应很明显,枚举标志比结构更轻量级/内存方面的布尔数组。但是,似乎也有一些.NET框架类可以很好地适用于该任务,例如BitVector32或BitArray。如何使用BitVector32(由uint支持)进行存储并提供在特定索引处获取/设置位(如bools)的属性? Windows窗体似乎这样做。为开发人员提供更多代码,但看起来它会表现良好,并且封装将使下游API消费者更容易使用。嗯? – 2009-09-10 21:40:58