나는 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 비트 전환 안내서 는 유용한 리소스입니다.
답변
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을 사용하면 성능이 두 배로 향상되므로 메모리를 두 배로 사용하므로 부동 소수점 연산을 많이 수행하면 속도가 느려질 수 있습니다 .
답변
목표 -C
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
답변
2020 년 1 월 Xcode 11.3 / iOS13
스위프트 5
CoreGraphics 소스 코드에서
public struct CGFloat {
/// 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
답변
