Zwykle używam CGFloat wszędzie, ale zastanawiam się, czy dostanę z tym bezsensowny „hit wydajnościowy”. CGFloat wydaje się być czymś „cięższym” niż float, prawda? W których punktach powinienem używać CGFloat i co tak naprawdę robi różnicę?
Zwykle używam CGFloat wszędzie, ale zastanawiam się, czy dostanę z tym bezsensowny „hit wydajnościowy”. CGFloat wydaje się być czymś „cięższym” niż float, prawda? W których punktach powinienem używać CGFloat i co tak naprawdę robi różnicę?
Odpowiedzi:
Jak stwierdził @weichsel, CGFloat to tylko definicja typu dla albo float
lubdouble
. Możesz się o tym przekonać, dwukrotnie klikając Command na „CGFloat” w Xcode - nastąpi przejście do nagłówka CGBase.h, w którym zdefiniowano typedef. To samo podejście jest stosowane również w przypadku NSInteger i NSUInteger.
Te typy zostały wprowadzone, aby ułatwić pisanie kodu, który działa zarówno w wersji 32-bitowej, jak i 64-bitowej bez modyfikacji. Jeśli jednak wszystko, czego potrzebujesz, to float
precyzja we własnym kodzie, nadal możesz jej używać, float
jeśli chcesz - zmniejszy to nieco zużycie pamięci. To samo dotyczy wartości całkowitych.
Sugeruję, abyś poświęcił skromny czas potrzebny na wyczyszczenie aplikacji 64-bitowej i spróbuj uruchomić ją jako taką, ponieważ większość komputerów Mac ma teraz 64-bitowe procesory, a Snow Leopard jest w pełni 64-bitowy, w tym jądro i aplikacje użytkownika. 64-bitowy przewodnik Apple dotyczący przejścia dla kakao jest przydatnym źródłem informacji.
int
?
CGFloat jest zwykłym pływakiem w systemach 32-bitowych i podwójnym w systemach 64-bitowych
typedef float CGFloat;// 32-bit
typedef double CGFloat;// 64-bit
Więc nie otrzymasz żadnej utraty wydajności.
Jak powiedzieli inni, CGFloat jest zmiennoprzecinkową w systemach 32-bitowych i podwójną w systemach 64-bitowych. Jednak decyzja o tym została odziedziczona po OS X, gdzie została podjęta na podstawie charakterystyk wydajności wczesnych procesorów PowerPC. Innymi słowy, nie powinieneś myśleć, że zmiennoprzecinkowy jest dla 32-bitowych procesorów, a podwójny dla 64-bitowych procesorów. (Uważam, że procesory ARM firmy Apple były w stanie przetwarzać podwojenia na długo przed ich przejściem na 64-bitowe). Głównym hitem związanym z używaniem podwójnych układów jest to, że wykorzystują dwukrotnie więcej pamięci, a zatem mogą być wolniejsze, jeśli wykonujesz wiele operacji zmiennoprzecinkowych .
Z kodu źródłowego Fundacji, w 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.
Zasadniczo robi to:
#if defined(__LP64__) && __LP64__
typedef double CGFloat;
#else
typedef float CGFloat;
#endif
Gdzie __LP64__
wskazuje, czy aktualna architektura * jest 64-bitowa.
Zwróć uwagę, że systemy 32-bitowe mogą nadal korzystać z 64-bitowego double
, po prostu zajmuje to więcej czasu procesora, więc CoreGraphics robi to w celach optymalizacji, a nie w celu zapewnienia zgodności. Jeśli nie zależy Ci na wydajności, ale na dokładności, po prostu użyj double
.
W Swift CGFloat
jest struct
opakowaniem Float
na architekturach 32-bitowych lub Double
64-bitowych (można to wykryć w czasie wykonywania lub kompilacji za pomocąCGFloat.NativeType
)
Z kodu źródłowego CoreGraphics wCGFloat.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
* W szczególności long
s i wskaźniki, stąd rozszerzenie LP
. Zobacz także: http://www.unix.org/version2/whatsnew/lp64_wp.html
tylko o tym wspomnę - styczeń, 2020 Xcode 11.3 / iOS13
Szybki 5
Z kodu źródłowego 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