在LP64中,long
的大小和long long
的大小相同(Apple Docs,Unix Docs)。
当你将自己限制在LP64系统上运行时(在编译64位时出现XCode时),在long
和{{1之间}}?如果您的目标是64位积分,是否有任何性能原因可以使用long long
代替long
?
这就是我问的原因。在Xcode的Objective C中,NSString的格式(如printf)和NSNumber在转换数字和文本时都使用long long
,int
,long
等数据类型及其无符号变体。不是特定的比特长度数字,如long long
,int16_t
。和int32
。这样就很难对需要特定最小尺寸的东西(即网络或货币应用程序)进行编程,或者在没有进行类型转换的情况下将特定大小的数据存储到NSNumber中时很难。
对于任何英特尔Mac OS或iOS设备,在与NSString&#39等交互时使用int64_t
int
和int32_t
long long
是否安全? ; s格式函数和NSNumber?
答案 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更容易。