我倾向于在各处使用CGFloat,但是我想知道这样做是否会给我带来毫无意义的“性能冲击”。CGFloat似乎比float更“重”,对吗?在什么时候应该使用CGFloat,什么才是真正的区别?
我倾向于在各处使用CGFloat,但是我想知道这样做是否会给我带来毫无意义的“性能冲击”。CGFloat似乎比float更“重”,对吗?在什么时候应该使用CGFloat,什么才是真正的区别?
Answers:
如@weichsel所述,CGFloat只是float
or 的typedef double
。您可以通过在Xcode中双击“ CGFloat”来自己查看-它会跳到CGBase.h标头,其中定义了typedef。NSInteger和NSUInteger也使用相同的方法。
引入这些类型是为了使编写无需修改就可以在32位和64位上运行的代码变得更加容易。但是,如果您所需要的只是float
在自己的代码中保持精确度,那么您仍然可以float
根据需要使用它-它将在某种程度上减少内存占用。整数值也是如此。
我建议您花一些时间使您的应用程序保持64位清洁,然后尝试以这种方式运行它,因为大多数Mac现在都具有64位CPU,而Snow Leopard是完全64位的,包括内核和用户应用程序。苹果公司针对可可的64位过渡指南是有用的资源。
int
?
CGFloat是32位系统上的常规float,在64位系统上是double
typedef float CGFloat;// 32-bit
typedef double CGFloat;// 64-bit
因此您不会受到任何性能损失。
从基金会的源代码中,在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
是32位体系结构或64 位体系结构的struct
包装器(您可以在运行时或编译时使用来检测到这一点)Float
Double
CGFloat.NativeType
从CoreGraphics源代码中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
s和指针,因此是LP
。另请参阅:http : //www.unix.org/version2/whatsnew/lp64_wp.html
提一下-2020年1月Xcode 11.3 / iOS13
斯威夫特5
从CoreGraphics源代码
public struct CGFloat {
/// 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