9

现在有了 64 位架构的 iPhone。long变成 64 位(而int仍然是 32 位),并且使用 NSInteger 的所有地方现在都是 along等 64 位而不是 32。Twitter 有很多人说“我很高兴我在所有地方都使用了 NSInteger 而不是 int” .

如果您需要存储不超过 32 位的值(例如,在仅循环 25 次的循环中),为什么要使用 long,因为 32(至少)高位将为空。

如果程序处理的是 32 位整数,那么当它占用更多内存时,使用 64 位整数有什么好处?

此外,在某些情况下,使用 64 位整数会产生与使用 32 位整数不同的结果。因此,如果您使用 NSInteger,那么某些东西可能在 iPhone 5S 上有效,但在旧设备上无效,而如果显式使用 int 或 long,则结果在任何设备上都是相同的。

4

3 回答 3

1

如果您需要存储不超过 32 位的值……为什么要使用 long ?

如果您真的可以保证,那么绝对没有理由将 64 位类型的价值超过 32 位类型。对于有界循环、计数器和一般算术等简单操作,32 位整数就足够了。但是对于更复杂的操作,尤其是那些需要高性能应用程序的操作——例如那些执行音频或图像处理的操作——处理器在 64 位模式下可以处理的数据量的增加是显着的。

如果程序处理的是 32 位整数,那么当它占用更多内存时,使用 64 位整数有什么好处?

您使使用更多内存似乎是一件坏事。通过将某些数据类型的大小加倍,它们可以被寻址到内存中的更多位置,并且可以寻址的内存越多,操作系统花费在加载代码上的时间就越少。此外,处理器总线中的数据通道数量是处理器总线数量的两倍,这意味着一次可以处理的值增加一个数量级,而寄存器大小的增加意味着可以将更多的数据保留在一个数量级。一个寄存器。简而言之,这相当于大多数应用程序的速度几乎自动翻倍。

还会有使用 64 位整数与使用 32 位整数产生不同结果的情况?...

是的,但不是你想的那样。32 位数据类型和操作以及 64 位操作(大多数在软件中模拟,或者通过 32 位主机中的特殊硬件或操作码)在大小方面“相对稳定”。由于不同的编译器实现了不同版本的 64 位数据类型(参见LP64、SILP64 和 LLP64)。实际上,这意味着将 64 位类型转换为 32 位类型 - 比如说指向 int 的指针 - 保证会导致信息丢失,但是在保证为 64 位的两种数据类型之间转换 - 指针和长在 LP64 上 - 可以接受。ARM 通常使用 LP64 编译(所有 int 都是 32 位,所有 long 都是 64 位)。同样,大多数开发人员不应该受到开关的影响,但是当您开始处理尝试以整数存储的任意大数字时,精度就会成为问题。

出于这个原因,我建议在公共接口和没有固有边界检查或溢出防护的 API 中使用 NSUInteger 和 NSInteger。例如,TableView 请求 NSUInteger 数量的数据不是因为它担心 32 位和 64 位数据结构,而是因为它不能保证编译它的架构。Apple 尝试制作独立于架构的数据类型实际上有点奢侈,考虑到您只需要做很少的工作即可让您的代码在两种架构中编译并“正常工作”。

于 2013-09-11T06:50:49.287 回答
-1

如果您的应用程序在 32 位或 64 位引擎上运行,Apple 会注意向后兼容性,并会在后台使用__LP64__宏将您的变量转换为适当的数据类型。

#if __LP64__ 
    typedef long NSInteger; 
    typedef unsigned long NSUInteger; 
#else 
    typedef int NSInteger; 
    typedef unsigned int NSUInteger; 
#endif 
于 2013-09-11T07:07:10.580 回答
-1

NSInteger 的内部存储可以是许多不同的支持类型之一,这就是为什么您可以在任何地方使用它而无需担心它,这就是它的全部意义所在。

于 2013-09-11T04:39:04.453 回答