使用CGFloat和float有什么区别?

我倾向于在所有地方使用CGFloat,但是我不知道是否会因此而导致无谓的“性能下降”。 CGFloat似乎比浮动“重”,对吧? 我应该在哪些地方使用CGFloat,真正的区别是什么?

正如@weichsel所说,CGFloat只是floatdouble的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位上的Doublestruct封装(可以在运行或编译时使用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