あちこちでCGFloatを使用する傾向がありますが、これで意味のない「パフォーマンスヒット」が発生するのではないかと思います。CGFloatはfloatよりも「重い」ようですよね?どの時点でCGFloatを使用する必要がありますか、そして実際に何が違いますか?
あちこちでCGFloatを使用する傾向がありますが、これで意味のない「パフォーマンスヒット」が発生するのではないかと思います。CGFloatはfloatよりも「重い」ようですよね?どの時点でCGFloatを使用する必要がありますか、そして実際に何が違いますか?
回答:
@weichselが述べたように、CGFloatはどちらかのtypedefにすぎません float
かdouble
。Xcodeの「CGFloat」をCommand-ダブルクリックすると、自分で確認できます。typedefが定義されているCGBase.hヘッダーにジャンプします。同じアプローチがNSIntegerとNSUIntegerにも使用されます。
これらの型は、変更なしで32ビットと64ビットの両方で機能するコードを簡単に記述できるようにするために導入されました。ただし、必要なのがfloat
自分のコード内の精度て使用float
できます。これにより、メモリフットプリントが多少削減されます。整数値についても同様です。
ほとんどのMacには64ビットCPUが搭載されており、Snow Leopardはカーネルとユーザーアプリケーションを含めて完全に64ビットであるため、アプリを64ビットクリーンにするために必要な適度な時間を費やして、そのように実行することをお勧めします。AppleのCocoa 64ビット移行ガイドは、便利なリソースです。
int
?
CGFloatは、32ビットシステムでは通常の浮動小数点であり、64ビットシステムではdoubleです。
typedef float CGFloat;// 32-bit
typedef double CGFloat;// 64-bit
したがって、パフォーマンスが低下することはありません。
他の人が言ったように、CGFloatは32ビットシステムではfloat、64ビットシステムではdoubleです。ただし、その決定は、初期のPowerPC CPUのパフォーマンス特性に基づいて行われたOS Xから継承されました。つまり、floatが32ビットCPU用であり、doubleが64ビットCPU用であるとは考えないでください。(私は、AppleのARMプロセッサは64ビットになるよりずっと前にdoubleを処理できたと思います。)doubleを使用する主なパフォーマンスヒットは、2倍のメモリを使用するため、多くの浮動小数点演算を行うと遅くなる可能性があります。 。
CoreGraphics 'のFoundationソースコードから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
。
スウィフトでは、CGFloat
あるstruct
いずれかのラッパーFloat
、32ビットアーキテクチャ上またはDouble
(あなたがしてランやコンパイル時にこれを検出することができ、64ビットのものに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