来自" 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为什么要这样做?有什么优势?
我似乎只能想到缺点。请赐教。
答案 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
是特定于架构的)是有趣的。但他们使Float
和Double
架构独立。语言中没有CGFloat
的等价物。我认为这是默认的CGFloat
不是最好的主意。 NEON仅支持单精度浮点数学运算。必须在VFP上进行双精度数学运算。 (当CGFloat
被发明时,并不是要考虑NEON。)
答案 1 :(得分:1)
这是表演的事。
在32位CPU上,单个精度,32位float
可以存储在一个寄存器中,并快速有效地移动,因为它的大小与架构相同 - 原生指针。
在64位CPU架构上,64位IEEE double
具有与本机指针/寄存器/等大小相同的优点。