使用CGFloat和float有什么区别?

时间:2009-08-12 08:26:41

标签: iphone objective-c cocoa-touch

我倾向于在整个地方使用CGFloat,但我想知道我是否会因此而遭受无意义的“性能打击”。 CGFloat似乎比浮动“更重”,对吧?我应该在哪些方面使用CGFloat,是什么让真正与众不同?

4 个答案:

答案 0 :(得分:185)

正如@weichsel所说,CGFloat只是floatdouble的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)

的Objective-C

来自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