সিজিফ্লোট এবং ফ্লোট ব্যবহারের মধ্যে পার্থক্য কী?


169

আমি পুরো জায়গা জুড়ে সিজিফ্লোট ব্যবহার করার প্রবণতা রাখি তবে আমি ভাবছি যে এটি দিয়ে যদি আমি কোনও বুদ্ধিমান "পারফরম্যান্স হিট" পাই তবে। সিজিফ্লোট ভাসমানের চেয়ে কিছু "ভারী" বলে মনে হচ্ছে, তাই না? কোন পয়েন্টে আমাকে সিজিএফ্লোট ব্যবহার করা উচিত, এবং আসলে কী তফাত তৈরি করে?

উত্তর:


193

বিবৃত @weichsel হিসেবে CGFloat মাত্র পারেন জন্য একটি typedef হয় floatবাdouble । আপনি নিজেরাই এক্সকোডের "সিজিফ্লোয়েট" -তে ডাবল-ক্লিক করে কমান্ড-এর মাধ্যমে দেখতে পাচ্ছেন - এটি সিজিবিসিএইচ হেডারে যাবে যেখানে টাইপডেফ সংজ্ঞায়িত হয়েছে। একই পদ্ধতি এনএসআইন্টেজার এবং এনএসইআইএনটিজারের জন্যও ব্যবহৃত হয়।

এই ধরনের কোডগুলি লিখিতকরণে আরও সহজ করার জন্য প্রবর্তিত হয়েছিল যা 32-বিট এবং -৪-বিট উভয় ক্ষেত্রেই সংশোধন ছাড়াই কাজ করে। তবে, আপনার যা দরকার তা যদি floatআপনার নিজের কোডের মধ্যে যথার্থ হয় floatতবে আপনি যদি চান তবে ব্যবহার করতে পারেন - এটি আপনার মেমরির পদক্ষেপ কিছুটা কমিয়ে দেবে। একই পূর্ণসংখ্যার মানগুলির জন্য যায়।

আমি আপনাকে পরামর্শ দিচ্ছি যে আপনার অ্যাপ্লিকেশনটিকে -৪-বিট পরিষ্কার করার জন্য প্রয়োজনীয় সময় ব্যয় করুন এবং এটিকে চালানোর চেষ্টা করুন, কারণ বেশিরভাগ ম্যাকের কাছে এখন 64৪-বিট সিপিইউ রয়েছে এবং স্নো লেপার্ডের সম্পূর্ণ কার্নেল এবং ব্যবহারকারীর অ্যাপ্লিকেশন রয়েছে 64৪-বিট। অ্যাপল এর কোকো জন্য 64৪ বিট স্থানান্তর গাইড একটি দরকারী সংস্থান।


আমি এখন এটি পেয়েছি বলে মনে করি। তবে আইফোনে মনে হয় বেশি কিছু যায় না, তাই না?

4
আইফোনে যেমন আমরা এটি জানি, না। তবে, ভবিষ্যতের প্রমাণ কোডটি সর্বদা বুদ্ধিমান এবং এটি ওএস এক্সের জন্য একই কোডটিকে নিরাপদে পুনরায় ব্যবহার করা সহজ করে তুলবে
কুইন টেলর

সুতরাং আপনি বলছেন, মূলত, প্রসেসরের আর্কিটেকচারের সাথে আপনি আবদ্ধ থাকবেন তার পর থেকে সরাসরি কোনও ফ্লোট বা ডাবল কখনও ব্যবহার করবেন না (এবং আমি ভেবেছিলাম যে এই বছর আগে জেভিএম দ্রুত সমাধান করেছে :))। তাহলে কি আদিমরা নিরাপদ? int?
ড্যান রোজনস্টার্ক

9
আমি কখনও বলিনি যে সরাসরি কোনও আদিম ব্যবহার করা হয় না। এমন অনেক সময় রয়েছে যে সরাসরি আদিম সমস্যা হতে পারে, যেমন যদি কোনও ভেরিয়েবলটি ডেটা সংরক্ষণ করতে ব্যবহার করা যেতে পারে যা উপচে পড়তে পারে যেমন 64৪-বিটের মতো। সাধারণভাবে, আর্কিটেকচার-নির্ভর টাইপডেফগুলি ব্যবহার করা আরও নিরাপদ, সেই কোডটিতে অন্য কোনও স্থাপত্যে বিস্ফোরণের সম্ভাবনা কম less তবে, কখনও কখনও 32-বিট টাইপ ব্যবহার করা সম্পূর্ণ নিরাপদ এবং আপনার স্মৃতি সংরক্ষণ করতে পারে। জেভিএম-তে আদিম আকারগুলির আকার কম হতে পারে তবে ওবজ-সি এবং সি সংকলিত রয়েছে, এবং 32 এবং 64 বিট লাইব্রেরি এবং কোড মেশানো আসলেই সমস্যাযুক্ত।
কুইন টেলর

1
@ কুইনটেলর কীভাবে আপনি সিজিফ্লোট না ভাসতে ভাসতে ভাসতে পারে তার একটি বাস্তব উদাহরণ প্রদান করতে পারেন? ফ্লোট এবং সিজিএফ্লোট উভয়েরই সীমাবদ্ধ বিট রয়েছে। আপনি উভয়ই ধরে রাখতে পারেন তার চেয়ে বেশি বিট সংরক্ষণ করার প্রয়োজনের মাধ্যমে তারা উভয়কে উপচে ফেলতে পারেন।
পিউনার

76

সিজিফ্লোট 32-বিট সিস্টেমে নিয়মিত ফ্লোট এবং 64-বিট সিস্টেমে ডাবল

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

সুতরাং আপনি কোনও কার্যকারিতা পেনাল্টি পাবেন না।


3
ঠিক আছে, আপনি স্মৃতি নিয়ে চিন্তিত থাকলে দ্বিগুণ মেমরি ব্যবহার করেন।
টাইলার

8
যদিও কেবল 64৪-বিটে।
কুইন টেলর

13
সঠিক, আইফোন ওএস 32-বিট। আপনি যদি এটির বিষয়ে চিন্তা করেন, আইফোনটি 32 গিগাবাইটের 4 গিগাবাইট র‌্যাম সীমাবদ্ধতার দিকে চাপ দিচ্ছে না বা এটি কোনও ইন্টেল প্রসেসরও ব্যবহার করছে না (যার জন্য 64-বিট 32-বিটের চেয়ে দ্রুততর)। এছাড়াও, এটি মডার্ন রানটাইম ব্যবহার করছে (ডেস্কটপে 32-বিটের লিগ্যাসি রানটাইমের বিপরীতে - আপনি যদি কৌতূহলী হন তবে এই পদগুলির জন্য এসও উইক করুন) যাতে এটি মূলত 64-বিট ওএস এক্স পারে সবকিছু করতে পারে। সম্ভবত কোনও দিন আমরা এমন একটি ডিভাইস দেখতে পাব যা আইফোন ওএস চালায় এবং 64৪-বিট, তবে বর্তমানে কোনওটি নেই।
কুইন টেলর

23
প্রবেশ করুন: আইফোন 5 এস
dgund

7
5 এস এখন bit৪ বিটের, শেষবার আমি সম্মেলনে প্রবেশ করলাম (লন্ডন), তারা বলেছে যে তারা আইওএস on-তে 32-বিট অ্যাপ্লিকেশন চালায় তা হল মেমরিতে আরও একটি ভাগ করা ক্যাশে পুল চালানো, যার ফলে সামগ্রিকভাবে আরও বেশি স্মৃতি ব্যবহার করা যেতে পারে। সুতরাং এর ডিএফ মূল্য সমস্ত কিছু 64-বিট পর্যন্ত রূপান্তর করতে পারে। (আপনি যদি
5.1+

2

অন্যরা যেমন বলেছে, সিজিফ্লোট 32-বিট সিস্টেমে ভাসা এবং 64-বিট সিস্টেমে ডাবল। যাইহোক, এটি করার সিদ্ধান্তটি ওএস এক্স থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয়েছিল, যেখানে এটি প্রাথমিক বিদ্যুৎ সিপিইউগুলির পারফরম্যান্স বৈশিষ্ট্যের ভিত্তিতে করা হয়েছিল। অন্য কথায়, আপনি ভাবেন না যে ভাসাটি 32-বিট সিপিইউগুলির জন্য এবং ডাবল 64-বিট সিপিইউগুলির জন্য। (আমি বিশ্বাস করি, অ্যাপল এর এআরএম প্রসেসরগুলি 64৪-বিট যাওয়ার আগে ডাবলগুলি অনেক আগে প্রক্রিয়া করতে সক্ষম হয়েছিল।) ডাবলগুলি ব্যবহারের মূল পারফরম্যান্স হিট তারা দ্বিগুণ মেমরি ব্যবহার করেছে এবং তাই আপনি যদি অনেকগুলি ভাসমান পয়েন্ট অপারেশন করছেন তবে ধীর হতে পারে might ।


2

উদ্দেশ্য গ

কোর গ্রাফিক্সের ফাউন্ডেশনের উত্স কোড থেকে 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

কপিরাইট (সি) 2000-2011 অ্যাপল ইনক।

এটি মূলত করছে:

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

কোথায় __LP64__ বর্তমান আর্কিটেকচার * 64-বিট কিনা তা নির্দেশ করে।

মনে রাখবেন যে 32-বিট সিস্টেমগুলি এখনও 64-বিট ব্যবহার করতে পারে double, এটি কেবলমাত্র আরও প্রসেসরের সময় নেয়, সুতরাং কোরিগ্রাফিকগুলি এটি উপযুক্ততার জন্য নয়, অনুকূলকরণের উদ্দেশ্যে ব্যবহার করে। আপনি যদি পারফরম্যান্স সম্পর্কে উদ্বিগ্ন না হন তবে নির্ভুলতার বিষয়ে উদ্বিগ্ন হন, সহজভাবে ব্যবহার করুন 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 এক্সকোড 11.3 / আইওএস 13

সুইফট 5

কোরগ্রাফিক্স উত্স কোড থেকে

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.