首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有理由在NSInteger中使用uint8_t而不是使用NS_ENUM?

是否有理由在NSInteger中使用uint8_t而不是使用NS_ENUM?
EN

Stack Overflow用户
提问于 2016-05-06 15:43:07
回答 3查看 380关注 0票数 3

通用标准似乎使用NS_ENUMNSInteger作为基本类型。为什么是这种情况?假设少于256个情况(几乎涵盖任何枚举),那么是否有理由使用它而不是uint8_t,因为它可以占用更少的内存空间?要么进口斯威夫特罚款。

这与NS_OPTIONS不同,后者更大的类型是有意义的,因为您不应该对枚举进行任何算术运算,并且可以使用基类型表示的每个数字作为值。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-05-08 07:25:16

标题中问题的答案是:

是否有理由在NSInteger中使用uint8_t而不是使用NS_ENUM?

很可能不是。

在C中声明枚举时,如果没有指定基础类型,编译器可以从char和有符号和无符号整数类型中选择任何合适的类型,这些类型至少可以表示所有所需的值。当前的Xcode/Clang编译器选择一个4字节的整数。人们可以合理地假设编译器编写者做出了明智的选择--某种性能和存储的平衡。

较小的类型(如uint8_t )通常将在内存(或磁盘)中较小的边界上对齐,但这只有在相邻字段与对齐匹配时才有好处,例如,如果2字节大小的类型化字段跟随1字节大小的类型字段,那么除非另有指定(例如使用#pragma packed),否则可能会有一个中间未使用的字节。

性能或存储差异是否显著将在很大程度上取决于应用程序。遵循通常的经验法则--在发现问题之前不要进行优化。

然而,如果您发现限制大小在语义上的好处,那么当然是这样做的--没有什么通用的理由不应该这样做。这种选择类似于选择有符号整数和无符号整数,一些程序员避免使用≥0的无符号类型,除非额外的范围是绝对必要的,而另一些程序员则欣赏语义上的好处。

摘要:没有正确的答案,这主要是一个主观的问题。

HTH

票数 2
EN

Stack Overflow用户

发布于 2016-05-06 15:53:30

首先,内存占用几乎完全没有意义。你说的是1字节对4/8字节。(如果内存对齐没有强制使用4/8字节,则不管您选择什么。)您希望在运行的应用程序中有多少NS_ENUM (C)对象?

我想原因很简单:NSInteger类似于Cocoa中的"catch all“整数类型。这使得分配更容易,特别是您不必关心将更大的整数类型分配给较小的整数类型。如果不进行强制转换,这将导致警告。

在一个32/64位模型的桌面应用程序中,拥有一个以上的整数类型类似于一个时代错误。也不是Mac,也不是MacBook,iPhone也不是嵌入式微控制器…。

票数 1
EN

Stack Overflow用户

发布于 2016-05-08 10:09:30

您可以使用任何整数数据类型,包括uint8_t和NS_ENUM as。

代码语言:javascript
复制
typedef NS_ENUM(uint8_t, eEnumAddEditViewMode) {
  eWBEnumAddMode,
  eWBEnumEditMode

};

在旧的c风格标准中,NSInteger是默认的,因为NSInteger类似于目标C中的"catch all“整数类型,开发人员可以轻松地使用自己的变量键入装箱和取消装箱。这只是开发者友好的最佳实践。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37076427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档