Tiendo a usar CGFloat por todas partes, pero me pregunto si obtengo un "golpe de rendimiento" sin sentido con esto. CGFloat parece ser algo "más pesado" que flotar, ¿verdad? ¿En qué puntos debo usar CGFloat y qué hace realmente la diferencia?
Tiendo a usar CGFloat por todas partes, pero me pregunto si obtengo un "golpe de rendimiento" sin sentido con esto. CGFloat parece ser algo "más pesado" que flotar, ¿verdad? ¿En qué puntos debo usar CGFloat y qué hace realmente la diferencia?
Respuestas:
Como dijo @weichsel, CGFloat es solo un typedef para cualquiera float
o double
. Puede verlo usted mismo haciendo Comando haciendo doble clic en "CGFloat" en Xcode: saltará al encabezado CGBase.h donde se define typedef. El mismo enfoque se usa para NSInteger y NSUInteger también.
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 float
precisión dentro de su propio código, aún puede usarlo float
si lo desea: reducirá un poco la huella de su memoria. Lo mismo ocurre con los valores enteros.
Le sugiero que invierta el modesto tiempo requerido para limpiar su aplicación de 64 bits e intente ejecutarla como tal, ya que la mayoría de las Macs ahora tienen CPU de 64 bits y Snow Leopard es totalmente de 64 bits, incluidas las aplicaciones de kernel y de usuario. La Guía de transición de 64 bits de Apple para Cocoa es un recurso útil.
int
?
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
Por lo tanto, no obtendrá ninguna penalización de rendimiento.
Como otros han dicho, CGFloat es flotante en sistemas de 32 bits y doble en sistemas de 64 bits. Sin embargo, la decisión de hacerlo fue heredada de OS X, donde se tomó en función de las características de rendimiento de las primeras CPU PowerPC. En otras palabras, no debe pensar que float es para CPU de 32 bits y el doble es 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 golpe de rendimiento del uso de dobles es que usan el doble de memoria y, por lo tanto, podrían ser más lentos si realiza muchas operaciones de coma flotante .
Del código fuente de la Fundación, en CoreGraphics ' 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 esencialmente está haciendo:
#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 los de 64 bits double
, solo lleva más tiempo de procesador, por lo que CoreGraphics lo hace con fines de optimización, no por compatibilidad. Si no le preocupa el rendimiento pero le preocupa la precisión, simplemente utilícelo double
.
En Swift, CGFloat
es una struct
envoltura ya sea Float
en arquitecturas de 32 bits o Double
en arquitecturas de 64 bits (puede detectar esto en tiempo de ejecución o compilación con CGFloat.NativeType
)
Del código fuente de CoreGraphics, enCGFloat.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
sy punteros, de ahí el LP
. Ver también: http://www.unix.org/version2/whatsnew/lp64_wp.html
solo mencione eso: enero de 2020 Xcode 11.3 / iOS13
Swift 5
Del código fuente de 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