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
Авторское право (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
)
Из исходного кода 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
* Конкретно, long
s и указатели, отсюда LP
. Смотрите также: http://www.unix.org/version2/whatsnew/lp64_wp.html