为什么 Apple 在他们的 类 中使用 "flags" 结构?
Why Does Apple use "flags" Structs In Their Classes?
我的问题是关于 Apple Objective-C headers 中的 style/structure。以NSSplitViewItem
为例:
NSSplitViewItem(苹果):
@interface NSSplitViewItem : NSObject {
@private
id _splitViewItemPrivateData;
struct {
unsigned int _collapsed:1;
unsigned int _canCollapseFromDrag:1;
unsigned int _canCollapseFromDoubleClickOnDivider:1;
unsigned int _reserved:29;
} _flags;
}
为什么是结构体?
为什么 Apple 似乎更喜欢使用 int
标志结构作为选项?这种模式在他们的 headers 中非常普遍,即使是在看起来没有必要的地方——比如这里。为什么不将那些 ints
作为 iVars 放在 class 上,而不是将它们包装到一个结构中?
是否有一些性能提升或其他好处?在这里,"flags" 都与 "collapasing" 有关。但在其他 class 中,例如 NSTableView
,有 "flags" 结构有超过两打不相关的条目。
所以这只是苹果风格,还是有更有意义的东西?
他们正在使用位域。在这种情况下,这意味着三个值仅存储在 32 位中。此外,为了将来的扩展,他们可以在相同的 32 位中添加 29 个布尔变量,而无需更改结构布局。如果数据是持久化的,那么再添加这 29 个变量甚至不需要更改版本号。
如果您有两打不相关的值,那么两打值仅存储在 32 位 = 4 字节中。这一切都有助于内存使用。
我的问题是关于 Apple Objective-C headers 中的 style/structure。以NSSplitViewItem
为例:
NSSplitViewItem(苹果):
@interface NSSplitViewItem : NSObject { @private id _splitViewItemPrivateData; struct { unsigned int _collapsed:1; unsigned int _canCollapseFromDrag:1; unsigned int _canCollapseFromDoubleClickOnDivider:1; unsigned int _reserved:29; } _flags; }
为什么是结构体?
为什么 Apple 似乎更喜欢使用 int
标志结构作为选项?这种模式在他们的 headers 中非常普遍,即使是在看起来没有必要的地方——比如这里。为什么不将那些 ints
作为 iVars 放在 class 上,而不是将它们包装到一个结构中?
是否有一些性能提升或其他好处?在这里,"flags" 都与 "collapasing" 有关。但在其他 class 中,例如 NSTableView
,有 "flags" 结构有超过两打不相关的条目。
所以这只是苹果风格,还是有更有意义的东西?
他们正在使用位域。在这种情况下,这意味着三个值仅存储在 32 位中。此外,为了将来的扩展,他们可以在相同的 32 位中添加 29 个布尔变量,而无需更改结构布局。如果数据是持久化的,那么再添加这 29 个变量甚至不需要更改版本号。
如果您有两打不相关的值,那么两打值仅存储在 32 位 = 4 字节中。这一切都有助于内存使用。