reloj pantalla descargar color cambio cambiar apple apariencia iphone objective-c cocoa-touch

iphone - pantalla - itunes



¿Cuál es la diferencia entre usar CGFloat y float? (4)

C objetivo

Desde el código fuente de Foundation, en CGBase.h de 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.

Esto es esencialmente hacer:

#if defined(__LP64__) && __LP64__ typedef double CGFloat; #else typedef float CGFloat; #endif

Donde __LP64__ indica si la arquitectura actual * es de 64 bits.

Tenga en cuenta que los sistemas de 32 bits aún pueden usar el double 64 bits, solo requiere más tiempo de procesador, por lo que CoreGraphics lo hace con fines de optimización, no de compatibilidad. Si no está preocupado por el rendimiento, pero le preocupa la precisión, simplemente use el double .

Rápido

En Swift, CGFloat es un contenedor de struct alrededor de Float en arquitecturas de 32 bits o Double on 64 bit (Puedes detectar esto en tiempo de ejecución o compilación con CGFloat.NativeType )

Del código fuente de CGFloat.swift.gyb , en 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

* Específicamente, long s y punteros, de ahí el LP . Ver también: __LP64__

Tiendo a usar CGFloat por todos lados, pero me pregunto si obtendré un "golpe de rendimiento" sin sentido con esto. CGFloat parece ser algo "más pesado" que flotar, ¿verdad? ¿En qué puntos debería usar CGFloat, y qué hace realmente la diferencia?


CGFloat es un flotante regular en sistemas de 32 bits y un doble en sistemas de 64 bits

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

Entonces no obtendrás ninguna penalización de rendimiento.


Como han dicho otros, CGFloat es flotante en sistemas de 32 bits y un doble en sistemas de 64 bits. Sin embargo, la decisión de hacerlo se hereda de OS X, donde se hizo en base a las características de rendimiento de las primeras CPU PowerPC. En otras palabras, no debería pensar que el flotante es para CPU de 32 bits y el doble para CPU de 64 bits. (Creo que los procesadores ARM de Apple pudieron procesar dobles mucho antes de que fueran de 64 bits). El principal impacto de rendimiento del uso de dobles es que usan el doble de memoria y, por lo tanto, pueden ser más lentos si se realizan muchas operaciones de punto flotante. .


Como @weichsel declaró, CGFloat es solo un typedef para float o double . Puede verlo usted mismo haciendo un doble clic en "CGFloat" en Xcode: saltará al encabezado CGBase.h donde se define typedef. El mismo enfoque se usa también para NSInteger y NSUInteger.

Estos tipos se introdujeron para facilitar la escritura de código que funciona tanto en 32 bits como en 64 bits sin modificaciones. Sin embargo, si todo lo que necesita es precisión de float dentro de su propio código, aún puede usar float si lo desea, reducirá un poco su huella de memoria. Lo mismo vale para valores enteros.

Te sugiero que inviertas el modesto tiempo necesario para que tu aplicación esté limpia a 64 bits e intente ejecutarla como tal, ya que la mayoría de los Mac ahora tienen CPU de 64 bits y Snow Leopard es completamente de 64 bits, incluidas las aplicaciones kernel y de usuario. La Guía de transición de 64 bits de Apple para Cocoa es un recurso útil.