CGFloat और फ्लोट के उपयोग में क्या अंतर है?


169

मैं सभी जगह CGFloat का उपयोग करता हूं, लेकिन मुझे आश्चर्य होता है कि क्या मुझे इसके साथ एक "प्रदर्शन हिट" की भावनाहीनता मिलती है। CGFloat नाव से कुछ "भारी" लगता है, है ना? मुझे किन बिंदुओं पर CGFloat का उपयोग करना चाहिए, और वास्तव में क्या फर्क पड़ता है?

जवाबों:


193

जैसा कि @weichsel ने कहा है, CGFloat floatया तो केवल एक टाइफाइड है double। आप Xcode में "CGFloat" पर कमांड-डबल-क्लिक करके अपने लिए देख सकते हैं - यह CGBase.h हेडर पर जाएगा जहां टाइपडिफ को परिभाषित किया गया है। उसी दृष्टिकोण का उपयोग NSInteger और NSUInteger के लिए भी किया जाता है।

इन प्रकारों को कोड लिखना आसान बनाने के लिए शुरू किया गया था जो 32-बिट और 64-बिट दोनों पर काम करता है। हालाँकि, यदि आपको अपनी आवश्यकता के अनुसार floatअपने कोड में सटीक है, तो आप अभी भी उपयोग कर सकते हैं floatयदि आपको पसंद है - यह आपकी मेमोरी फ़ुटप्रिंट को कुछ हद तक कम कर देगा। समान पूर्णांक मानों के लिए जाता है।

मेरा सुझाव है कि आप अपने ऐप को 64-बिट स्वच्छ बनाने के लिए आवश्यक मामूली समय का निवेश करें और इसे इस तरह से चलाने की कोशिश करें, क्योंकि अधिकांश मैक में अब 64-बिट सीपीयू और स्नो लेपर्ड पूरी तरह से 64-बिट है, जिसमें कर्नेल और उपयोगकर्ता एप्लिकेशन शामिल हैं। कोको के लिए एप्पल का 64-बिट ट्रांज़िशन गाइड एक उपयोगी संसाधन है।


मुझे लगता है मैं अब समझ गया। लेकिन iPhone पर यह ज्यादा मायने नहीं रखता है, है ना?

4
IPhone पर जैसा कि हम जानते हैं, नहीं। हालाँकि, यह हमेशा भविष्य के प्रमाण कोड के लिए बुद्धिमान होता है, और इससे OS X के लिए समान कोड को सुरक्षित रूप से पुन: उपयोग करना आसान हो जाता है।
क्विन टेलर

तो आप कह रहे हैं, मूल रूप से, कभी भी एक फ्लोट या डबल का उपयोग न करें, तब से आप प्रोसेसर आर्किटेक्चर से बंध जाएंगे (और मुझे लगा कि इस साल पहले हल किए गए JVMs :)। तो क्या आदिम सुरक्षित हैं? int?
बजे डैन रोसेनस्टार्क

9
मैंने कभी नहीं कहा कि सीधे एक आदिम का उपयोग करें। ऐसे समय होते हैं जब सीधे प्राइमिटिव्स समस्याग्रस्त हो सकते हैं, जैसे कि यदि कोई वैरिएबल का उपयोग डेटा को स्टोर करने के लिए किया जा सकता है, जो कि 64-बिट जैसे अतिप्रवाह कर सकता है। सामान्य तौर पर, आर्किटेक्चर-निर्भर टाइपसीफ का उपयोग करना अधिक सुरक्षित होता है, उस कोड में एक अलग आर्किटेक्चर पर विस्फोट होने की संभावना कम होती है। हालांकि, कभी-कभी 32-बिट प्रकार का उपयोग पूरी तरह से सुरक्षित हो सकता है और आपको मेमोरी को बचा सकता है। आदिम का आकार एक जेवीएम में एक मुद्दे से कम हो सकता है, लेकिन ओब्ज-सी और सी संकलित हैं, और 32 और 64 बिट पुस्तकालयों और कोड को मिलाकर वास्तव में समस्याग्रस्त है।
क्विन टेलर

1
@QuinnTaylor आप इस बात का एक व्यावहारिक उदाहरण प्रदान कर सकते हैं कि CGFloat नहीं होने पर फ्लोट कैसे ओवरफ्लो होगा? फ्लोट और CGFloat दोनों में बिट्स की सीमित संख्या होती है। जरूरत से ज्यादा बिट्स को स्टोर करने के लिए आप दोनों को ओवरफ्लो कर सकते हैं।
प्वेनर

76

CGFloat 32-बिट सिस्टम पर एक नियमित फ्लोट है और 64-बिट सिस्टम पर एक डबल है

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

तो आपको कोई प्रदर्शन जुर्माना नहीं मिलेगा।


3
यदि आप स्मृति के बारे में चिंतित हैं, तो आप दुगनी स्मृति का उपयोग करते हैं।
टायलर

8
केवल 64-बिट पर, हालांकि।
क्विन टेलर

13
सही है, iPhone OS 32-बिट है। यदि आप इसके बारे में सोचते हैं, तो iPhone 32-बिट की 4GB रैम सीमा को आगे नहीं बढ़ा रहा है, न ही यह इंटेल प्रोसेसर का उपयोग कर रहा है (जिसके लिए 64-बिट 32-बिट से तेज है)। इसके अलावा, यह आधुनिक रनटाइम का उपयोग कर रहा है (जैसा कि डेस्कटॉप पर 32-बिट के लिगेसी रनटाइम के विपरीत है - इन शब्दों के लिए एसओ खोजें यदि आप उत्सुक हैं) तो यह मूल रूप से 64-बिट ओएस एक्स कर सकता है। शायद किसी दिन हम एक उपकरण देखेंगे जो iPhone OS चलाता है और 64-बिट है, लेकिन वर्तमान में कोई भी नहीं है।
क्विन टेलर

23
दर्ज करें: iPhone 5S
dgund 20

7
5S अब 64 बिट में है, पिछली बार जब मैंने कॉन्फ्रेंस (लंदन) में प्रवेश किया था, तो उन्होंने कहा कि जिस तरह से वे ios7 पर 32-बिट ऐप्स चलाते हैं, वह मेमोरी में एक और साझा कैश पूल में प्रवेश करने के लिए है, जिसके परिणामस्वरूप कुल मेमोरी का अधिक उपयोग किया जा सकता है। इसलिए इसका डीईट 64 बिट्स तक सब कुछ बदलने के लायक है। (जब तक आप अभी भी 5.1+ या 6.0+ समर्थन करना चाहते हैं)
phil88530

2

जैसा कि दूसरों ने कहा है, CGFloat 32-बिट सिस्टम पर एक फ्लोट है और 64-बिट सिस्टम पर एक डबल है। हालांकि, ऐसा करने का निर्णय ओएस एक्स से विरासत में मिला था, जहां इसे शुरुआती पावरपीसी सीपीयू के प्रदर्शन विशेषताओं के आधार पर बनाया गया था। दूसरे शब्दों में, आपको यह नहीं सोचना चाहिए कि फ्लोट 32-बिट सीपीयू के लिए है और डबल 64-बिट सीपीयू के लिए है। (मेरा मानना ​​है कि, एप्पल के एआरएम प्रोसेसर 64-बिट जाने से पहले डबल्स को संसाधित करने में सक्षम थे।) डबल्स का उपयोग करने का मुख्य प्रदर्शन हिट यह है कि वे दो बार मेमोरी का उपयोग करते हैं और इसलिए यदि आप बहुत सारे फ्लोटिंग पॉइंट ऑपरेशन कर रहे हैं, तो यह धीमा हो सकता है। ।


2

उद्देश्य सी

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

तीव्र

स्विफ्ट में, 32-बिट आर्किटेक्चर पर या 64-बिट वाले पर CGFloatएक structरैपर है (आप रन-वे पर इसका पता लगा सकते हैं या इसके साथ संकलन कर सकते हैं )FloatDoubleCGFloat.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एस और संकेत, इसलिए LP। इसे भी देखें: http://www.unix.org/version2/whatsnew/lp64_wp.html


1

बस उल्लेख है कि - जनवरी, 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.