В чем разница между использованием CGFloat и float?

Я обычно использую CGFloat повсюду, но мне интересно, не получаю ли я бессмысленный «удар производительности» с этим. CGFloat кажется чем-то «тяжелее», чем плавать, не так ли? В каких точках я должен использовать CGFloat, и что на самом деле имеет значение?

Как сказал @weichsel, CGFloat – это просто typedef для float или double . Вы можете сами убедиться в Command-двойном щелчке по «CGFloat» в Xcode – он перейдет к заголовку CGBase.h, где определен typedef. Такой же подход используется и для NSInteger и NSUInteger.

Эти типы были введены для упрощения написания кода, который работает как на 32-битных, так и на 64-битных без изменения. Однако, если все, что вам нужно, это точность float в вашем собственном коде, вы можете по-прежнему использовать float если хотите – это немного уменьшит объем памяти. То же самое относится к целым значениям.

Я предлагаю вам потратить скромное время на то, чтобы сделать ваше приложение 64-битным чистым и попробовать запустить его как таковое, так как большинство компьютеров Mac теперь имеют 64-битные процессоры, а Snow Leopard – полностью 64-разрядные, включая kernel ​​и пользовательские приложения. 64-разрядный переходный курс Apple для cocoa – полезный ресурс.

CGFloat является регулярным поплавком в 32-битных системах и двойной в 64-битных системах

 typedef float CGFloat;// 32-bit typedef double CGFloat;// 64-bit 

Таким образом, вы не получите никакого штрафа за производительность.

Как говорили другие, CGFloat – это поплавок на 32-битных системах и двойной в 64-битных системах. Однако решение сделать это было унаследовано от OS X, где оно было сделано на основе характеристик производительности ранних процессоров PowerPC. Другими словами, вы не должны думать, что float предназначен для 32-разрядных процессоров, а double – для 64-разрядных процессоров. (Я считаю, что процессоры ARM от Apple смогли обработать удвоилось задолго до того, как они перешли на 64-разрядную версию.) Основной удар по использованию удвоений состоит в том, что они используют вдвое больше памяти и, следовательно, могут быть медленнее, если вы выполняете много операций с плавающей запятой ,

Objective-C

Из исходного кода Foundation, в 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.

Это по существу делает:

 #if defined(__LP64__) && __LP64__ typedef double CGFloat; #else typedef float CGFloat; #endif 

Где __LP64__ указывает, является ли текущая архитектура * 64-разрядной.

Обратите внимание, что 32-разрядные системы все еще могут использовать 64-битный double , это требует большего времени процессора, поэтому CoreGraphics делает это для оптимизации, а не для совместимости. Если вас не интересует производительность, но они обеспокоены точностью, просто используйте double .

стриж

В Swift CGFloat является struct оболочкой вокруг Float на 32-разрядных архитектурах или Double на 64-битных (вы можете обнаружить это во время выполнения или компиляции с CGFloat.NativeType )

Из исходного кода CGFloat.swift.gyb в 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 

* В частности, long s и указатели, следовательно, LP . См. Также: http://www.unix.org/version2/whatsnew/lp64_wp.html

  • Держите iphone активным во время запуска программы
  • Воспроизведение музыки в фоновом режиме с помощью AVAudioplayer
  • Проблема с кодом: строка формата не является строковым литералом
  • Как я могу отложить вызов метода на 1 секунду?
  • @synthesize vs @dynamic, каковы различия?
  • UITextField: перемещение вида при появлении клавиатуры
  • Получить текущего первого ответчика без использования частного API
  • Есть ли способ удалить разделительную линию из UITableView?
  • Есть ли iPhone SDK API для твиттера?
  • Получите данные Exif от UIImage - UIImagePickerController
  • iPhone: как передавать данные между несколькими Viewcontrollers в приложении Tabbar
  • Давайте будем гением компьютера.