我倾向于在整个地方使用CGFloat,但我想知道我是否会因此而遭受无意义的“性能打击”。 CGFloat似乎比浮动“更重”,对吧?我应该在哪些方面使用CGFloat,是什么让真正与众不同?
答案 0 :(得分:185)
正如@weichsel所说,CGFloat只是float
或double
的typedef。您可以通过命令双击Xcode中的“CGFloat”来自行查看 - 它将跳转到定义了typedef的CGBase.h头文件中。同样的方法也用于NSInteger和NSUInteger。
这些类型的引入使得编写无需修改即可在32位和64位上运行的代码变得更加容易。但是,如果您在自己的代码中只需要float
精度,那么如果您愿意,仍然可以使用float
- 它会稍微减少您的内存占用。整数值也是如此。
我建议您投入适当的时间让您的应用程序保持64位清洁并尝试运行它,因为大多数Mac现在都有64位CPU而Snow Leopard完全是64位,包括内核和用户应用程序。 Apple的64-bit Transition Guide for Cocoa是一个有用的资源。
答案 1 :(得分:71)
CGFloat是32位系统上的常规浮点数 和64位系统上的双重
typedef float CGFloat;// 32-bit
typedef double CGFloat;// 64-bit
所以你不会受到任何性能损失。
答案 2 :(得分:1)
正如其他人所说,CGFloat在32位系统上是浮点数,在64位系统上是双倍的。但是,做到这一点的决定是继承自OS X,它是基于早期PowerPC CPU的性能特征而制定的。换句话说,您不应该认为float适用于32位CPU,而double适用于64位CPU。 (我相信,Apple的ARM处理器能够在64位之前处理双倍。) 使用双精度的主要性能是它们使用两倍的内存,因此如果你进行大量的浮点运算可能会更慢。
答案 3 :(得分:1)
来自Foundation的源代码,在CoreGraphics'CGBase.h
:
/* Definition of `CGFLOAT_TYPE', `CGFLOAT_IS_DOUBLE', `CGFLOAT_MIN', and
`CGFLOAT_MAX'. */
#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
/* Definition of the `CGFloat' type and `CGFLOAT_DEFINED'. */
typedef CGFLOAT_TYPE CGFloat;
#define CGFLOAT_DEFINED 1
版权所有(c)2000-2011 Apple Inc.
这基本上是这样做的:
#if defined(__LP64__) && __LP64__
typedef double CGFloat;
#else
typedef float CGFloat;
#endif
其中__LP64__
表示当前架构*是否为64位。
请注意,32位系统仍然可以使用64位double
,它只需要更多的处理器时间,因此CoreGraphics会出于优化目的而不是为了兼容性。如果您不关心性能但关注准确性,只需使用double
。
在Swift中,CGFloat
是一个struct
包装器,位于32位体系结构上的Float
或64位上的Double
(您可以在运行时检测到这一点)或编译时使用CGFloat.NativeType
)
来自CoreGraphics源代码in CGFloat.swift.gyb
:
public struct CGFloat {
#if arch(i386) || arch(arm)
/// The native type used to store the CGFloat, which is Float on
/// 32-bit architectures and Double on 64-bit architectures.
public typealias NativeType = Float
#elseif arch(x86_64) || arch(arm64)
/// The native type used to store the CGFloat, which is Float on
/// 32-bit architectures and Double on 64-bit architectures.
public typealias NativeType = Double
#endif
*具体来说,long
和指针,因此是LP
。另见:http://www.unix.org/version2/whatsnew/lp64_wp.html