Tendo a usare CGFloat dappertutto, ma mi chiedo se ottengo un "colpo di performance" insensato con questo. CGFloat sembra essere qualcosa di "più pesante" del galleggiante, giusto? In quali punti dovrei usare CGFloat e cosa fa davvero la differenza?
Tendo a usare CGFloat dappertutto, ma mi chiedo se ottengo un "colpo di performance" insensato con questo. CGFloat sembra essere qualcosa di "più pesante" del galleggiante, giusto? In quali punti dovrei usare CGFloat e cosa fa davvero la differenza?
Risposte:
Come affermato da @weichsel, CGFloat è solo un typedef per float
o double
. Puoi vederlo tu stesso facendo doppio clic su Comando facendo clic su "CGFloat" in Xcode - salterà all'intestazione CGBase.h dove è definito typedef. Lo stesso approccio viene utilizzato anche per NSInteger e NSUInteger.
Questi tipi sono stati introdotti per semplificare la scrittura di codice che funziona su 32 e 64 bit senza modifiche. Tuttavia, se tutto ciò di cui hai bisogno è la float
precisione all'interno del tuo codice, puoi comunque utilizzarlo float
se lo desideri - ridurrà in qualche modo il tuo spazio di memoria. Lo stesso vale per i valori interi.
Ti suggerisco di investire il modesto tempo necessario per rendere la tua app a 64 bit pulita e provare a eseguirla come tale, poiché la maggior parte dei Mac ora ha CPU a 64 bit e Snow Leopard è completamente a 64 bit, inclusi il kernel e le applicazioni utente. La Guida alla transizione a 64 bit di Apple per Cocoa è una risorsa utile.
int
?
CGFloat è un float regolare su sistemi a 32 bit e un doppio su sistemi a 64 bit
typedef float CGFloat;// 32-bit
typedef double CGFloat;// 64-bit
Quindi non riceverai alcuna penalità per le prestazioni.
Come altri hanno già detto, CGFloat è un float su sistemi a 32 bit e un doppio su sistemi a 64 bit. Tuttavia, la decisione di farlo è stata ereditata da OS X, dove è stata presa in base alle caratteristiche prestazionali delle prime CPU PowerPC. In altre parole, non dovresti pensare che float sia per CPU a 32 bit e double sia per CPU a 64 bit. (Credo che i processori ARM di Apple siano stati in grado di elaborare i doppi molto prima che diventassero a 64 bit.) Il principale risultato in termini di prestazioni dell'uso dei doppi è che usano il doppio della memoria e quindi potrebbero essere più lenti se si eseguono molte operazioni in virgola mobile .
Dal codice sorgente della Fondazione, in 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.
Questo sta essenzialmente facendo:
#if defined(__LP64__) && __LP64__
typedef double CGFloat;
#else
typedef float CGFloat;
#endif
Dove __LP64__
indica se l'architettura corrente * è a 64 bit.
Si noti che i sistemi a 32 bit possono ancora utilizzare il 64-bit double
, richiede solo più tempo del processore, quindi CoreGraphics lo fa per scopi di ottimizzazione, non per compatibilità. Se non sei preoccupato per le prestazioni ma per la precisione, usa semplicemente double
.
In Swift, CGFloat
è un struct
wrapper Float
su architetture a 32 bit o Double
su quelle a 64 bit (è possibile rilevarlo in fase di esecuzione o di compilazione con CGFloat.NativeType
)
Dal codice sorgente CoreGraphics, inCGFloat.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
* In particolare, long
s e puntatori, quindi il LP
. Vedi anche: http://www.unix.org/version2/whatsnew/lp64_wp.html
basta menzionarlo: gennaio 2020 Xcode 11.3 / iOS13
Swift 5
Dal codice sorgente 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