最好在64位使用长或长

时间:2016-01-04 23:28:03

标签: ios objective-c

在LP64中,long的大小和long long的大小相同(Apple DocsUnix Docs)。

当你将自己限制在LP64系统上运行时(在编译64位时出现XCode时),在long和{{1之间}}?如果您的目标是64位积分,是否有任何性能原因可以使用long long代替long

这就是我问的原因。在Xcode的Objective C中,NSString的格式(如printf)和NSNumber在转换数字和文本时都使用long longintlong等数据类型及其无符号变体。不是特定的比特长度数字,如long longint16_t。和int32。这样就很难对需要特定最小尺寸的东西(即网络或货币应用程序)进行编程,或者在没有进行类型转换的情况下将特定大小的数据存储到NSNumber中时很难。

对于任何英特尔Mac OS或iOS设备,在与NSString&#39等交互时使用int64_t intint32_t long long是否安全? ; s格式函数和NSNumber?

2 个答案:

答案 0 :(得分:2)

  

对于任何英特尔Mac OS或iOS设备,在与NSString的格式函数和NSNumber等交互时使用int for int32_t和long long for int64_t是否安全?

根据ILP32& LP64约定是的,但您应该记录您依赖这些尺寸。

这样做的一种方法是在Linux内核中使用一个聪明的宏(据我所知):

#define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))

如果其condition参数为true,则此宏将生成编译时错误,因为在这种情况下,它会尝试确定负大小数组的大小。您可以在以下简单功能中使用它:

static __attribute__((unused)) void _compile_time_use_only_()
{
   BUILD_BUG_ON( (sizeof(int) != 4) );
   BUILD_BUG_ON( (sizeof(long long) != 8) );
}

将其添加到您的代码中,如果您尝试在int不是32位或long long不是64位的任何系统上进行编译,那么您将收到编译时错误。运行时基本上没有成本(对于未使用的函数只有几个字节)。

确保您评论该功能,说明它的作用!

你当然可以用同样的方式断言其他类型的大小。

HTH

答案 1 :(得分:0)

使用NSInteger或int64_t。 NSInteger =具有至少32位的最快类型,并且与数组的大小等兼容.int64_t =正好是64位。这也将使Swift更容易。