3

我听说人们使用 NSInteger 或 CGFloat 等类型而不是 int 或 float 是因为与 64 位系统有关。我仍然不明白为什么这是必要的,即使我在自己的代码中都这样做了。基本上,为什么 64 位系统需要更大的整数?

人们还说目前在 iOS 中没有必要,尽管将来可能需要 64 位 iphone 等。

4

2 回答 2

5

这一切都在这里解释:

64 位转换指南简介

在主要 64 位更改部分中:

在此处输入图像描述

数据类型大小和对齐方式

OS X 使用两种数据模型:ILP32(其中整数、长整数和指针是 32 位量)和 LP64(其中整数是 32 位量,长整数和指针是 64 位量)。其他类型等价于它们的 32 位对应物(除了 size_t 和一些基于长整数或指针的大小定义的其他类型)。

虽然几乎所有 UNIX 和 Linux 实现都使用 LP64,但其他操作系统使用各种数据模型。例如,Windows 使用 LLP64,其中 long long 变量和指针是 64 位的量,而 long 整数是 32 位的量。相比之下,Cray 使用 ILP64,其中 int 变量也是 64 位量。

在 OS X 中,用于数据结构布局的默认对齐方式是自然对齐方式(下面会提到一些例外情况)。自然对齐意味着结构中的数据元素以对应于底层数据类型宽度的间隔对齐。例如,一个 4 字节宽的 int 变量将在 4 字节边界上对齐。

您可以在本文档中阅读更多内容。它写得很好。我强烈推荐给你。

于 2013-03-22T23:02:15.280 回答
4

本质上归结为:如果您使用 CGFloat/NSInteger/etc,Apple 可以进行向后不兼容的更改,您可以通过重新编译代码来更新您的应用程序。你真的不想通过你的应用程序,检查每次使用intand double

有哪些向后不兼容的变化?很多!

  • M68K 转 PowerPC
  • 64 位 PowerPC
  • PowerPC 到 x86
  • x86-64(我不确定这是在 iOS 之前还是之后。)
  • iOS

CGFloat表示“CoreGraphics”使用的浮点类型:double在 OS X 和floatiOS 上。如果您使用CGFloat,您的代码将在两个平台上运行,而不会不必要地损失性能(在 iOS 上)或精度(在 OS X 上)。

NSInteger并且NSUInteger不太明确,但它们大约用于您可能使用的地方ssize_tsize_t标准 C 中。int或者unsigned int在 64 位 OS X 上根本不够大,您可能有一个包含超过 20 亿个项目的列表。(由于定义的方式,未签名不会将其增加到 40 亿NSNotFound。)

于 2013-03-22T23:25:35.517 回答