나는 CGFloat를 사방에서 사용하는 경향이 있지만, 이것으로 의미없는 "성능 적중"을 얻었는지 궁금합니다. CGFloat는 플로트보다 "무거운"것 같습니다. 어떤 시점에서 CGFloat을 사용해야합니까? 그리고 실제로 어떤 차이가 있습니까?
나는 CGFloat를 사방에서 사용하는 경향이 있지만, 이것으로 의미없는 "성능 적중"을 얻었는지 궁금합니다. CGFloat는 플로트보다 "무거운"것 같습니다. 어떤 시점에서 CGFloat을 사용해야합니까? 그리고 실제로 어떤 차이가 있습니까?
답변:
@weichsel이 언급했듯이 CGFloat는 float
또는에 대한 typedef입니다 double
. Xcode에서 "CGFloat"를 두 번 클릭하여 직접 확인할 수 있습니다. typedef가 정의 된 CGBase.h 헤더로 이동합니다. NSInteger 및 NSUInteger에도 동일한 접근 방식이 사용됩니다.
이러한 유형은 수정없이 32 비트 및 64 비트 모두에서 작동하는 코드를보다 쉽게 작성할 수 있도록 도입되었습니다. 그러나 필요한 모든 것이 float
자신의 코드 내에서 정밀한 float
경우 에도 원하는 경우 계속 사용할 수 있습니다. 이렇게하면 메모리 사용 공간이 다소 줄어 듭니다. 정수 값도 마찬가지입니다.
대부분의 Mac에는 이제 64 비트 CPU가 있고 Snow Leopard는 커널 및 사용자 응용 프로그램을 포함하여 완전히 64 비트이므로 앱을 64 비트를 깨끗하게 정리하고 실행하는 데 필요한 적당한 시간을 투자하는 것이 좋습니다. Cocoa 용 Apple 64 비트 전환 안내서 는 유용한 리소스입니다.
int
?
CGFloat는 32 비트 시스템에서 일반 플로트이고 64 비트 시스템에서 이중 플로트입니다.
typedef float CGFloat;// 32-bit
typedef double CGFloat;// 64-bit
따라서 성능 저하가 발생하지 않습니다.
다른 사람들이 말했듯이 CGFloat는 32 비트 시스템에서 부동 소수점이며 64 비트 시스템에서 이중 부호입니다. 그러나 그 결정은 초기 PowerPC CPU의 성능 특성을 기반으로 한 OS X에서 상속되었습니다. 다시 말해 float는 32 비트 CPU 용이고 double은 64 비트 CPU 용이라고 생각해서는 안됩니다. (저는 Apple의 ARM 프로세서가 64 비트가되기 훨씬 전에 두 배를 처리 할 수 있다고 생각합니다.) Double을 사용하면 성능이 두 배로 향상되므로 메모리를 두 배로 사용하므로 부동 소수점 연산을 많이 수행하면 속도가 느려질 수 있습니다 .
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
저작권 (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
A는 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