使用CGFloat和float有什么区别?
我倾向于在所有地方使用CGFloat,但是我不知道是否会因此而导致无谓的“性能下降”。 CGFloat似乎比浮动“重”,对吧? 我应该在哪些地方使用CGFloat,真正的区别是什么?
正如@weichsel所说,CGFloat只是float
或double
的typedef。 你可以通过命令双击XCode中的“CGFloat”来看到自己,它将跳转到定义typedef的CGBase.h头文件。 NSInteger和NSUInteger也使用相同的方法。
引入了这些types可以使编写32位和64位的代码变得更容易,而不需要修改。 然而,如果你所需要的只是你自己的代码中的float
精度,你仍然可以使用float
如果你喜欢的话 – 它会减less你的内存占用量。 整数值也一样。
我build议你投入一点时间,让你的应用程序64位干净,并尝试运行它,因为大多数Mac现在有64位CPU和雪豹是完全64位,包括内核和用户应用程序。 苹果的64位Cocoa过渡指南是一个有用的资源。
CGFloat是32位系统上的常规浮点数,在64位系统上是double浮点数
typedef float CGFloat;// 32-bit typedef double CGFloat;// 64-bit
所以你不会得到任何performance的惩罚。
正如其他人所说的那样,CGFloat在32位系统上是浮点数,在64位系统上是双精度浮点数。 但是,做决定是从OS Xinheritance而来的,它是根据早期PowerPC CPU的性能特点制定的。 换句话说,你不应该认为float是32位CPU,double是64位CPU。 (我相信,苹果公司的ARM处理器能够在64位之前处理双倍的性能)。使用双精度的主要性能影响是它们使用了两倍的内存,因此如果您正在进行大量的浮点运算。
Objective-C的
从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
Copyright(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位体系结构上的Float
或64位上的Double
的struct
封装(可以在运行或编译时使用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
和指针,因此LP
。 另见: http : //www.unix.org/version2/whatsnew/lp64_wp.html