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

时间:2015-05-22 13:08:08

标签: objective-c core-graphics

来自" 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

Apple为什么要这样做?有什么优势?

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

2 个答案:

答案 0 :(得分:4)

Apple明确表示他们这样做"to provide a wider range and accuracy for graphical quantities."您可以辩论更广泛的范围和准确性是否真的对实践有所帮助,但Apple明确了他们的想法。

值得记住的是,BTW在OS X 10.5中添加了CGFloat,早在iPhone之前(当然早在64位iPhone之前)。对于像Mac这样的“大内存”机器来说,64位更有利。而苹果制造的“本地架构”类型应该可以让它更容易在“旧”和“新”世界之间转换。我认为Swift带来NSInteger作为默认的Int类型(即Int是特定于架构的)是有趣的。但他们使FloatDouble架构独立。语言中没有CGFloat的等价物。我认为这是默认的CGFloat不是最好的主意。 NEON仅支持单精度浮点数学运算。必须在VFP上进行双精度数学运算。 (当CGFloat被发明时,并不是要考虑NEON。)

答案 1 :(得分:1)

这是表演的事。

在32位CPU上,单个精度,32位float可以存储在一个寄存器中,并快速有效地移动,因为它的大小与架构相同 - 原生指针。

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