CGFloat와 float 사용의 차이점은 무엇입니까?


169

나는 CGFloat를 사방에서 사용하는 경향이 있지만, 이것으로 의미없는 "성능 적중"을 얻었는지 궁금합니다. CGFloat는 플로트보다 "무거운"것 같습니다. 어떤 시점에서 CGFloat을 사용해야합니까? 그리고 실제로 어떤 차이가 있습니까?

답변:


193

@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 비트 전환 안내서 는 유용한 리소스입니다.


나는 지금 그것을 얻는다 생각한다. 그러나 iPhone에서는별로 중요하지 않은 것 같습니다.

4
우리가 아는 것처럼 iPhone에서. 그러나 항상 미래를 보장하는 코드를 사용하는 것이 현명하며 OS X에 대해 동일한 코드를 안전하게 재사용하는 것이 더 쉬워 질 것입니다.
Quinn Taylor

따라서 기본적으로 float 또는 double을 직접 사용하지 마십시오. 그 이후 프로세서 아키텍처에 묶여있을 것입니다 (그리고 몇 년 전에 빠른 JVM이 해결되었다고 생각했습니다). 어떤 프리미티브가 안전합니까? int?
Dan Rosenstark

9
나는 원시적을 직접 사용하지 말라고 말하지 않았다. 변수가 64 비트와 같이 오버플로 될 수있는 데이터를 저장하는 데 사용될 수있는 경우와 같이 직선 프리미티브가 문제가 될 수있는 경우가 있습니다. 일반적으로 아키텍처에 의존하는 typedef를 사용하는 것이 안전합니다. 코드가 다른 아키텍처에서 폭발 할 가능성이 적기 때문입니다. 그러나 때로는 32 비트 유형을 사용하면 완전히 안전하고 메모리를 절약 할 수 있습니다. 프리미티브의 크기는 JVM에서 덜 문제가 될 수 있지만 Obj-C와 C는 컴파일되며 32 및 64 비트 라이브러리와 코드를 혼합하는 것은 실제로 문제가됩니다.
Quinn Taylor

1
@QuinnTaylor CGFloat가 플로트하지 않는 동안 플로트가 어떻게 오버플로되는지에 대한 실용적인 예를 제공 할 수 있습니까? float와 CGFloat는 모두 유한 한 비트 수를 갖습니다. 보유 할 수있는 것보다 많은 비트를 저장해야하므로 둘 다 오버 플로우 할 수 있습니다.
Pwner

76

CGFloat는 32 비트 시스템에서 일반 플로트이고 64 비트 시스템에서 이중 플로트입니다.

typedef float CGFloat;// 32-bit
typedef double CGFloat;// 64-bit

따라서 성능 저하가 발생하지 않습니다.


3
메모리가 걱정된다면 두 배의 메모리를 사용합니다.
Tyler

8
그러나 64 비트에서만 가능합니다.
Quinn Taylor

13
iPhone OS는 32 비트입니다. 당신이 그것에 대해 생각하면, iPhone은 32 비트의 4GB RAM 제한을 추진하지 않으며 Intel 프로세서 (64 비트가 32 비트보다 빠름)를 사용하지도 않습니다. 또한 Modern Runtime (데스크톱에서 32 비트의 레거시 런타임과 반대로-궁금한 경우이 용어로 wearch와 달리)을 사용하므로 기본적으로 64 비트 OS X가 할 수있는 모든 것을 할 수 있습니다. 아마도 언젠가 우리는 iPhone OS를 실행하고 64 비트 인 장치를 보게 될 것입니다. 그러나 현재는 없습니다.
Quinn Taylor

23
입력 : 아이폰 5S
dgund

7
5S는 이제 64 비트로, 지난번 회의에 참석했을 때 (ios7) 32 비트 앱을 ios7에서 실행하는 방식은 메모리에 다른 공유 캐시 풀을 초기화하는 것으로 전체에 더 많은 메모리를 사용할 수 있다고 말했습니다. 따라서 def는 모든 것을 64 비트로 변환 할 가치가 있습니다. (5.1+ 또는 6.0+ 스틸을 계속 지원하지 않으려는 경우)
phil88530

2

다른 사람들이 말했듯이 CGFloat는 32 비트 시스템에서 부동 소수점이며 64 비트 시스템에서 이중 부호입니다. 그러나 그 결정은 초기 PowerPC CPU의 성능 특성을 기반으로 한 OS X에서 상속되었습니다. 다시 말해 float는 32 비트 CPU 용이고 double은 64 비트 CPU 용이라고 생각해서는 안됩니다. (저는 Apple의 ARM 프로세서가 64 비트가되기 훨씬 전에 두 배를 처리 할 수 ​​있다고 생각합니다.) Double을 사용하면 성능이 두 배로 향상되므로 메모리를 두 배로 사용하므로 부동 소수점 연산을 많이 수행하면 속도가 느려질 수 있습니다 .


2

목표 -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.

빠른

스위프트에서, CGFloatA는 struct래퍼 주위 중 Float32 비트 아키텍처 또는 Double64 비트들에 (당신과 함께 런 또는 컴파일시이를 감지 할 수 있습니다 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

* 구체적으로, longs 및 포인터 LP. 참조 : http://www.unix.org/version2/whatsnew/lp64_wp.html


1

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.