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?
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
Por lo tanto, no obtendrá ninguna penalización de rendimiento.
fuente
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 .
fuente
C objetivo
Del código fuente de la Fundación, en CoreGraphics '
CGBase.h
:Copyright (c) 2000-2011 Apple Inc.
Esto esencialmente está haciendo:
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ícelodouble
.Rápido
En Swift,
CGFloat
es unastruct
envoltura ya seaFloat
en arquitecturas de 32 bits oDouble
en arquitecturas de 64 bits (puede detectar esto en tiempo de ejecución o compilación conCGFloat.NativeType
)Del código fuente de CoreGraphics, en
CGFloat.swift.gyb
:* Específicamente,
long
sy punteros, de ahí elLP
. Ver también: http://www.unix.org/version2/whatsnew/lp64_wp.htmlfuente
solo mencione eso: enero de 2020 Xcode 11.3 / iOS13
Swift 5
Del código fuente de CoreGraphics
fuente