ฉันมักจะใช้ CGFloat ไปทั่วทุกที่ แต่ฉันสงสัยว่าฉันได้รับ "การแสดงที่มีประสิทธิภาพ" อย่างนี้หรือไม่ CGFloat ดูเหมือนจะเป็นอะไรที่ "หนักกว่า" ลอยกว่าใช่มั้ย ฉันควรใช้ CGFloat ในจุดใดและอะไรทำให้เกิดความแตกต่างอย่างแท้จริง
ฉันมักจะใช้ CGFloat ไปทั่วทุกที่ แต่ฉันสงสัยว่าฉันได้รับ "การแสดงที่มีประสิทธิภาพ" อย่างนี้หรือไม่ CGFloat ดูเหมือนจะเป็นอะไรที่ "หนักกว่า" ลอยกว่าใช่มั้ย ฉันควรใช้ CGFloat ในจุดใดและอะไรทำให้เกิดความแตกต่างอย่างแท้จริง
คำตอบ:
ตามที่ @weichsel ระบุไว้ CGFloat เป็นเพียง typedef สำหรับอย่างใดอย่างหนึ่งfloat
หรือdouble
หรือคุณสามารถเห็นตัวคุณเองด้วย Command-ดับเบิลคลิกที่ "CGFloat" ใน Xcode - มันจะข้ามไปที่ส่วนหัว CGBase.h ที่กำหนด typedef วิธีการเดียวกันนี้ใช้สำหรับ NSInteger และ NSUInteger เช่นกัน
มีการแนะนำชนิดเหล่านี้เพื่อให้ง่ายต่อการเขียนโค้ดที่ทำงานได้ทั้งแบบ 32 บิตและ 64 บิตโดยไม่มีการดัดแปลง อย่างไรก็ตามหากคุณต้องการfloat
ความแม่นยำภายในรหัสของคุณเองคุณยังคงสามารถใช้งานได้float
ถ้าต้องการ - มันจะลดขนาดหน่วยความจำลง กันไปสำหรับค่าจำนวนเต็ม
ฉันขอแนะนำให้คุณลงทุนเวลาพอเหมาะในการทำให้แอปของคุณสะอาดและลองใช้งานเช่นนี้เนื่องจาก Mac ส่วนใหญ่ตอนนี้มี CPU 64 บิตและ Snow Leopard นั้นเต็ม 64 บิตรวมถึงเคอร์เนลและแอปพลิเคชันผู้ใช้ คู่มือการเปลี่ยนผ่าน 64 บิตของ Apple สำหรับ Cocoaเป็นทรัพยากรที่มีประโยชน์
int
?
CGFloat เป็นโฟลตปกติบนระบบ 32- บิตและเพิ่มเป็นสองเท่าในระบบ 64- บิต
typedef float CGFloat;// 32-bit
typedef double CGFloat;// 64-bit
ดังนั้นคุณจะไม่ได้รับการลงโทษใด ๆ
ดังที่คนอื่น ๆ พูดกันว่า CGFloat นั้นเป็นแบบลอยตัวบนระบบ 32 บิตและเพิ่มเป็นสองเท่าในระบบ 64 บิต อย่างไรก็ตามการตัดสินใจที่จะทำนั้นสืบทอดมาจาก OS X ซึ่งทำขึ้นตามลักษณะการทำงานของ CPU PowerPC รุ่นแรก กล่าวอีกนัยหนึ่งคุณไม่ควรคิดว่า float นั้นใช้กับ CPU แบบ 32 บิตและ double นั้นใช้กับ CPU แบบ 64 บิต (ฉันเชื่อว่าโปรเซสเซอร์ ARM ของ Apple สามารถประมวลผลได้นานเป็นสองเท่าก่อนที่พวกเขาจะไป 64 บิต) ประสิทธิภาพหลักของการใช้งาน double คือการที่พวกเขาใช้หน่วยความจำสองเท่าและดังนั้นจึงอาจช้าลง .
จากซอร์สโค้ดพื้นฐานใน 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
wrapper รอบ ๆ ทั้ง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
แค่พูดถึงว่า - ม.ค. 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