【发布时间】:2009-09-10 17:12:13
【问题描述】:
假设我有一个对象可能处于一个或多个真/假状态,我一直对为什么程序员经常使用标志+位掩码而不是只使用几个布尔值有点模糊。
它遍布 .NET 框架。不确定这是否是最好的示例,但 .NET 框架具有以下内容:
public enum AnchorStyles
{
None = 0,
Top = 1,
Bottom = 2,
Left = 4,
Right = 8
}
因此,给定锚样式,我们可以使用位掩码来确定选择了哪些状态。但是,您似乎可以使用 AnchorStyle 类/结构来完成相同的事情,该类/结构为每个可能的值定义了 bool 属性,或者一个单独的枚举值数组。
当然,我提出问题的主要原因是我想知道我是否应该在自己的代码中遵循类似的做法。
那么,为什么要使用这种方法?
- 内存消耗少? (它似乎不会消耗少于布尔数组/结构的消耗)
- 比结构或数组更好的堆栈/堆性能?
- 更快的比较操作?更快的增值/去除价值?
- 对编写它的开发者来说更方便?
【问题讨论】:
-
并不是我认为这是一个强有力的论点,但它确实消耗更少的内存。它使用了一个 int(4 个字节),而每个 bool 使用了一个字节。因此,4 个布尔值与 1 个 int 值相同。 32 个布尔值占用 32 个字节,而所有这些布尔值都可以在同一个枚举中。如果你去不推荐的路径,你可以使枚举长度为 8 个字节(sizeof(long))。
-
感谢您澄清这一点。它把我带到了这个帖子:stackoverflow.com/questions/294905/…
-
因此从响应中可以清楚地看出,枚举标志在内存方面比布尔结构/数组更轻量级。但是,似乎也有一些非常适合该任务的 .NET 框架类,例如 BitVector32 或 BitArray。使用 BitVector32(由 uint 支持)进行存储并提供在特定索引处获取/设置位(作为布尔值)的属性的结构呢? Windows 窗体似乎可以做到这一点。为开发人员提供更多代码,但似乎它会表现良好,并且封装将使下游 API 使用者更容易使用。嗯?