Я, як правило, використовую CGFloat всюди, але мені цікаво, чи отримую з цього безглуздий "ударний показник". CGFloat здається чимось "важчим", ніж float, правда? У яких моментах я повинен використовувати CGFloat, і що насправді має різницю?
Я, як правило, використовую CGFloat всюди, але мені цікаво, чи отримую з цього безглуздий "ударний показник". CGFloat здається чимось "важчим", ніж float, правда? У яких моментах я повинен використовувати CGFloat, і що насправді має різницю?
Відповіді:
Як зазначає @weichsel, CGFloat - це лише typedef для будь-якого floatабо double. Ви можете переконатися в тому, що двічі клацніть на команді "CGFloat" у Xcode - вона перейде до заголовка CGBase.h, де визначено typedef. Один і той же підхід використовується і для NSInteger та NSUInteger.
Ці типи були введені для полегшення запису коду, який працює як на 32-розрядному, так і на 64-розрядному без змін. Однак якщо все, що вам потрібно, - це floatточність у вашому власному коді, ви все одно можете використовувати, floatякщо вам подобається - це дещо зменшить слід вашої пам’яті. Те саме стосується цілих значень.
Я пропоную вам вкласти скромний час, необхідний для того, щоб зробити ваш додаток 64-бітним чистим, і спробувати запустити його як таке, оскільки більшість Macs зараз мають 64-розрядні процесори, а Snow Leopard повністю 64-бітний, включаючи ядро та користувацькі програми. 64-бітний посібник з переходу Apple на какао - корисний ресурс.
int?
CGFloat є звичайним плаваючим на 32-бітних системах і подвійним на 64-бітних системах
typedef float CGFloat;// 32-bit
typedef double CGFloat;// 64-bit
Таким чином, ви не отримаєте жодного штрафу за продуктивність.
Як вже говорили інші, CGFloat - це плаваючий на 32-бітних системах і подвійний на 64-бітних системах. Однак рішення зробити це було успадковано від OS X, де воно було прийняте на основі експлуатаційних характеристик ранніх процесорів PowerPC. Іншими словами, ви не повинні думати, що float призначений для 32-бітних процесорів, а подвійний - для 64-бітних процесорів. (Я вважаю, що ARM-процесори Apple змогли обробити парні задовго до того, як вони вийшли 64-бітними.) Основний хіт при використанні парних пар - це те, що вони використовують вдвічі більше пам’яті і тому можуть бути повільнішими, якщо ви робите багато операцій з плаваючою комою. .
З вихідного коду фонду в 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
Авторські права (c) 2000-2011 Apple Inc.
Це по суті:
#if defined(__LP64__) && __LP64__
typedef double CGFloat;
#else
typedef float CGFloat;
#endif
Де __LP64__вказується, чи поточна архітектура * 64-бітна.
Зауважте, що 32-бітні системи все ще можуть використовувати 64-бітні double, це просто забирає більше процесорного часу, тому CoreGraphics робить це для оптимізації, а не для сумісності. Якщо вас не турбує продуктивність, але ви стурбовані точністю, просто використовуйте double.
У Swift CGFloatє structобгортка навколо Float32-розрядної архітектури або Double64-бітової (Ви можете виявити це під час виконання або компіляції за допомогою CGFloat.NativeType)
З вихідного коду CoreGraphics вCGFloat.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
* Конкретно, longs і покажчики, звідси LP. Дивіться також: http://www.unix.org/version2/whatsnew/lp64_wp.html
лише згадайте про це - січ, 2020 р. Xcode 11.3 / iOS13
Швидкий 5
З вихідного коду 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