web-dev-qa-db-fra.com

Quelle est la différence entre CGFloat et float?

J'ai tendance à utiliser CGFloat un peu partout, mais je me demande si j'obtiens un "coup de performance" insensé avec cela. CGFloat semble être quelque chose de "plus lourd" que float, non? À quels moments devrais-je utiliser CGFloat et qu'est-ce qui fait vraiment la différence?

166
HelloMoon

Comme @weichsel l'a indiqué, CGFloat n'est qu'un type pour float ou double. Vous pouvez voir par vous-même en cliquant deux fois sur "CGFloat" dans Xcode, il passe directement à l'en-tête CGBase.h où le typedef est défini. La même approche est également utilisée pour NSInteger et NSUInteger.

Ces types ont été introduits pour faciliter l'écriture de code fonctionnant à la fois sur 32 bits et 64 bits sans modification. Cependant, si tout ce dont vous avez besoin est float précision dans votre propre code, vous pouvez toujours utiliser float si vous le souhaitez - cela réduira quelque peu votre empreinte mémoire. Il en va de même pour les valeurs entières.

Je vous suggère d'investir le peu de temps nécessaire pour rendre votre application propre 64 bits et d'essayer de l'exécuter en tant que telle, car la plupart des Mac ont désormais des processeurs 64 bits et Snow Leopard est entièrement 64 bits, y compris le noyau et les applications utilisateur. Le Guide de transition 64 bits pour Cocoa de Apple est une ressource utile.

187
Quinn Taylor

CGFloat est un float standard sur les systèmes 32 bits et un double sur les systèmes 64 bits

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

Donc, vous n'obtiendrez aucune pénalité de performance.

72
Thomas Zoechling

Objectif c

À partir du code source de Foundation, dans 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.

Cela consiste essentiellement à:

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

__LP64__ indique si l'architecture actuelle * est 64 bits.

Notez que les systèmes 32 bits peuvent toujours utiliser double 64 bits, il faut simplement plus de temps processeur, donc CoreGraphics le fait à des fins d'optimisation et non de compatibilité. Si vous n'êtes pas préoccupé par les performances mais par la précision, utilisez simplement double.

Swift

Dans Swift, CGFloat est un wrapper struct autour de Float sur des architectures 32 bits ou de Double sur des architectures 64 bits. (Vous pouvez le détecter au moment de l'exécution ou de la compilation avec CGFloat.NativeType )

À partir du code source de CoreGraphics, in 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

* Plus précisément, longs et des pointeurs, d’où le LP. Voir aussi: http://www.unix.org/version2/whatsnew/lp64_wp.html

1
Ben Leggiero

Comme d'autres l'ont dit, CGFloat est un flottant sur les systèmes 32 bits et un double sur les systèmes 64 bits. Cependant, la décision de le faire a été héritée d’OS X, où elle a été prise en fonction des caractéristiques de performances des premiers processeurs PowerPC. En d'autres termes, vous ne devriez pas penser que float concerne les processeurs 32 bits et double, les processeurs 64 bits. (Je crois que les processeurs ARM d'Apple ont été en mesure de traiter les doublons bien avant qu'ils ne passent au format 64 bits.) Le principal problème de performance de l'utilisation de doubles est qu'ils utilisent deux fois plus de mémoire et peuvent donc être plus lents si vous le faites. beaucoup d'opérations en virgule flottante.

1
user3259383