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ę?
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
Więc nie otrzymasz żadnej utraty wydajności.
źródło
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 .
źródło
Cel C
Z kodu źródłowego Fundacji, w CoreGraphics '
CGBase.h
:Copyright (c) 2000–2011 Apple Inc.
Zasadniczo robi to:
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żyjdouble
.Szybki
W Swift
CGFloat
jeststruct
opakowaniemFloat
na architekturach 32-bitowych lubDouble
64-bitowych (można to wykryć w czasie wykonywania lub kompilacji za pomocąCGFloat.NativeType
)Z kodu źródłowego CoreGraphics w
CGFloat.swift.gyb
:* W szczególności
long
s i wskaźniki, stąd rozszerzenieLP
. Zobacz także: http://www.unix.org/version2/whatsnew/lp64_wp.htmlźródło
tylko o tym wspomnę - styczeń, 2020 Xcode 11.3 / iOS13
Szybki 5
Z kodu źródłowego CoreGraphics
źródło