为什么CGFloat在32位上浮动并在64位上加​​倍?

Lys*_*gel 6 core-graphics objective-c

来自"CoreGraphics/CGBase.h":

#if defined(__LP64__) && __LP64__
# define CGFLOAT_TYPE double
# define CGFLOAT_IS_DOUBLE 1
# define CGFLOAT_MIN DBL_MIN
# define CGFLOAT_MAX DBL_MAX
#else
# define CGFLOAT_TYPE float
# define CGFLOAT_IS_DOUBLE 0
# define CGFLOAT_MIN FLT_MIN
# define CGFLOAT_MAX FLT_MAX
#endif
Run Code Online (Sandbox Code Playgroud)

Apple为什么要这样做?有什么好处?

我似乎只能想到缺点.请赐教.

ipm*_*mcc 1

这是一个性能问题。

在 32 位 CPU 上,单精度 32 位float可以存储在单个寄存器中,并快速有效地移动,因为它与体系结构本机指针的大小相同。

在 64 位 CPU 架构上,64 位 IEEEdouble具有与本机指针/寄存器等大小相同的相同优点。

  • 当时有很多讨论认为迁移到 64 位可能会损害性能。(苹果在这里讨论:https://developer.apple.com/library/mac/documentation/Darwin/Conceptual/64bitPorting/indicates/indicates.html#//apple_ref/doc/uid/TP40001064-CH206-TPXREF101)有时它是一场胜利,有时不是。很多胜利都来自于花哨的指针技巧(比如将 NSNumber 值粘贴在指针中),与浮点数学无关。我的记忆主要是“64 位是未来”,而不是“它会更快”。 (2认同)