Objective c NSInteger真的应该在任何地方使用吗?

Objective c NSInteger真的应该在任何地方使用吗?,objective-c,64-bit,Objective C,64 Bit,现在有了一款64位架构的iPhonelong变为64位(而int仍然是32位),并且NSInteger使用的所有地方现在都是long,因此64位不是32位。twitter上有不少人说“我很高兴我在所有地方都使用了NSInteger,而不是int” 如果您需要存储一个不超过32位的值(例如,在一个只循环25次的循环中),为什么要使用long,因为32(至少)高位将是空的 如果程序处理32位整数,那么当它使用更多内存时,使用64位整数有什么好处 此外,在某些情况下,使用64位整数会产生与使用32位整

现在有了一款64位架构的iPhone
long
变为64位(而
int
仍然是32位),并且NSInteger使用的所有地方现在都是
long
,因此64位不是32位。twitter上有不少人说“我很高兴我在所有地方都使用了NSInteger,而不是int”

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

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


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

NSInteger的内部存储可以是多种不同的备份类型之一,这就是为什么你可以在任何地方使用它,而不必担心它,这就是问题的关键所在

如果您需要存储一个不超过32位的值。。。为什么要使用长时间

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

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

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

此外,在某些情况下,使用64位整数会产生与使用32位整数不同的结果

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


出于这个原因,我建议在公共接口中使用NSUInteger和NSInteger,以及没有固有边界检查或溢出保护的API。例如,TableView请求整数量的数据不是因为它担心32位和64位的数据结构,而是因为它不能保证编译它所基于的体系结构。考虑到要让代码编译并“正常工作”所需的工作量是多么少,苹果公司试图使体系结构独立的数据类型实际上有点奢侈在这两种体系结构中。

如果你的应用程序运行在32位或64位引擎上,苹果会注意向后兼容性,并会使用
\uuu LP64\uu
宏在后台将变量转换为正确的数据类型

#if __LP64__ 
    typedef long NSInteger; 
    typedef unsigned long NSUInteger; 
#else 
    typedef int NSInteger; 
    typedef unsigned int NSUInteger; 
#endif 

NSInteger始终为您提供操作系统中可访问的“最大”整数数据类型—在iOS7之前和之后。这个宏只负责你的操作系统版本。我们总是鼓励您使用对您的特定问题有意义的“最小”数据类型。在iOS7之前和之后,您当然可以将布尔值存储在32位整数以及64位整数中。您的第二个答案“您让使用更多内存看起来像是件坏事”正是我一直在寻找的答案。不幸的是,由于我没有计算机科学背景,这完全超出了我的理解力。您是否可以举一个例子来说明在64位空间中存储数字“3”实际上是如何提高应用程序的速度的?我同意Jonathan的观点,这看起来像是对空间的巨大浪费,而且效率极低。这都是相同的
MOV
指令。导致加速的不是任意的小操作,而是可以沿着处理器总线流动的数据量造成了差异。这类似于拥有一条4车道的高速公路,而不是只有2条,然后尝试举办一场大型卡车拉力赛。你可以容纳更多的小数据(像普通的汽车),并挤进那些大卡车,而无需将数据切碎并按顺序运行。啊,很好,类比。我喜欢这样。所以,用你的类比,对一个小数字使用
长的
,不就有点像驾驶一辆只有一个孤独的小孩在后面的大型公共汽车吗?它占用的空间与一辆拥挤的公共汽车相同,但额外的空间被浪费了。(仔细想想,也许这个比喻让我困惑。)我觉得我没有掌握一些真正基本的东西,但似乎