`দীর্ঘ` নিষেধাজ্ঞার কী অর্থ হয়?


109

আজকের ক্রস-প্ল্যাটফর্ম সি ++ (বা সি) বিশ্বে আমাদের রয়েছে :

Data model  | short |   int |   long | long long | pointers/size_t  | Sample operating systems
... 
LLP64/IL32P64   16      32      32     64           64                Microsoft Windows (x86-64 and IA-64)
LP64/I32LP64    16      32      64     64           64                Most Unix and Unix-like systems, e.g. Solaris, Linux, BSD, and OS X; z/OS
...

আজ এর অর্থ কী, এটি কোনও "সাধারণ" (স্বাক্ষরিত) পূর্ণসংখ্যার জন্য intযথেষ্ট হবে এবং সি ++ অ্যাপ্লিকেশন কোড লেখার সময় সম্ভবত এখনও ডিফল্ট পূর্ণসংখ্যার প্রকার হিসাবে ব্যবহার করা যেতে পারে। এটি - বর্তমান ব্যবহারিক উদ্দেশ্যে - প্ল্যাটফর্মগুলির জুড়ে একটি সামঞ্জস্যপূর্ণ আকার রাখবে ।

যদি কোনও ব্যবহারের ক্ষেত্রে কমপক্ষে b৪ বিটের প্রয়োজন হয়, তবে আমরা আজ ব্যবহার করতে পারি long long, যদিও সম্ভবত কোনও ফিটনেস-নির্দিষ্টকরণের প্রকার বা __int64প্রকারটি আরও বেশি অর্থপূর্ণ হতে পারে।

এটি longমাঝখানে চলে যায় এবং আমরা longআমাদের অ্যাপ্লিকেশন কোড থেকে সরাসরি ব্যবহার নিষিদ্ধ করার বিষয়টি বিবেচনা করছি

এটি কি অর্থবহ হয়ে উঠবে , বা longআধুনিক সি ++ (বা সি) কোড ব্যবহার করার ক্ষেত্রে এমন কোনও মামলা রয়েছে যা ক্রস প্ল্যাটফর্ম চালাতে হবে? (প্ল্যাটফর্মটি হ'ল ডেস্কটপ, মোবাইল ডিভাইস, তবে মাইক্রোকন্ট্রোলার, ডিএসপি ইত্যাদির মতো জিনিস নয়))


সম্ভবত আকর্ষণীয় পটভূমি লিঙ্ক:


14
আপনি দীর্ঘকাল ব্যবহার করা লাইব্রেরিতে কলগুলি কীভাবে মোকাবেলা করবেন?
এঞ্জেল

14
long32 বিটের গ্যারান্টি দেওয়ার একমাত্র উপায়। int16 বিট হতে পারে তাই কিছু অ্যাপ্লিকেশনগুলির জন্য এটি পর্যাপ্ত নয়। হ্যাঁ, intকখনও কখনও আধুনিক সংকলকগুলিতে 16 বিট হয়। হ্যাঁ, লোকেরা মাইক্রোকন্ট্রোলারগুলিতে সফ্টওয়্যার লেখেন। আমি আরও লোককে এমন সফ্টওয়্যার লেখার পক্ষে যুক্তি দেব যা মাইক্রোকন্ট্রোলারগুলিতে পিসির চেয়ে বেশি আইফোন এবং অ্যান্ড্রয়েড ডিভাইসগুলির উত্থানের সাথে
আরডুইনোসের

53
চর, সংক্ষিপ্ত, আন্ত, দীর্ঘ এবং দীর্ঘ দীর্ঘ নিষিদ্ধ করে কেন [u] intXX_t প্রকারগুলি ব্যবহার করবেন না?
ইমিবিস

7
@ স্লেবেটম্যান আমি কিছুটা গভীর খনন করেছি, এটি প্রয়োজনীয়ভাবে এখনও উপস্থিত রয়েছে বলে মনে হয়, যদিও এটি .93.9.1.3 এ লুকানো আছে যেখানে সি ++ স্ট্যান্ডার্ড বলে: "স্বাক্ষরিত এবং স্বাক্ষরযুক্ত পূর্ণসংখ্যার ধরণগুলি সি স্ট্যান্ডার্ড, বিভাগ 5.2 এ প্রদত্ত প্রতিবন্ধকতাগুলি পূরণ করবে shall 4.2.1। " এবং সি স্ট্যান্ডার্ড -5.2.4.2.1 এ এটি ন্যূনতম ব্যাপ্তিটি বর্ণনা করেছে ঠিক যেমনটি আপনি লিখেছেন। আপনি একেবারে ঠিক বলেছেন। :) দৃশ্যত সি ++ স্ট্যান্ডার্ডের একটি অনুলিপি মালিকানাধীন, যথেষ্ট নয়, সি স্ট্যান্ডার্ডের অনুলিপিটিও খুঁজে পাওয়া দরকার।
টমি অ্যান্ডারসন

11
আপনি ডসবক্স / টার্বো সি ++ বিশ্বে অনুপস্থিত যা intএখনও খুব 16 টি বিট। এটি বলতে আমি ঘৃণা করি, তবে আপনি যদি "আজকের ক্রস-প্ল্যাটফর্ম ওয়ার্ল্ড" সম্পর্কে লিখতে যান তবে আপনি পুরো ভারতীয় উপমহাদেশকে উপেক্ষা করতে পারবেন না।
অরবিটে মেঘলা হালকা ঘোড়দৌড়

উত্তর:


17

আমি longআজকে ব্যবহার করার একমাত্র কারণ হ'ল এটি ব্যবহার করা বাহ্যিক ইন্টারফেস কল করা বা প্রয়োগ করা।

আপনি যেমনটি আপনার পোস্টে বলছেন সংক্ষিপ্ত এবং ইন্টের সমস্ত বড় ডেস্কটপ / সার্ভার / মোবাইল প্ল্যাটফর্মগুলিতে আজ যুক্তিসঙ্গতভাবে স্থিতিশীল বৈশিষ্ট্য রয়েছে এবং আমি এর অদূর ভবিষ্যতে পরিবর্তনের কোনও কারণ দেখতে পাচ্ছি না। তাই আমি এগুলি সাধারণভাবে এড়াতে খুব কম কারণ দেখি।

longঅন্যদিকে একটি জগাখিচুড়ি। সমস্ত 32-বিট সিস্টেমে আমি নিম্নলিখিত বৈশিষ্ট্যগুলি সম্পর্কে অবগত রয়েছি।

  1. এটি আকারে ঠিক 32-বিট ছিল।
  2. এটি মেমরি ঠিকানার মতো একই আকার ছিল।
  3. এটি সাধারণ আকারের রেজিস্টারে রাখা এবং একক নির্দেশনা দিয়ে কাজ করা যায় এমন ডেটার বৃহত্তম ইউনিট হিসাবে একই আকার ছিল।

এই বৈশিষ্ট্যগুলির এক বা একাধিকের উপর ভিত্তি করে প্রচুর পরিমাণে কোড লেখা হয়েছিল। তবে 64৪-বিটে স্থানান্তরিত করে তাদের সমস্ত সংরক্ষণ করা সম্ভব হয়নি। ইউনিক্সের মতো প্ল্যাটফর্মগুলি এলপি 64 এর জন্য গিয়েছিল যা বৈশিষ্ট্য 2 এবং 3 এর বৈশিষ্ট্য সংরক্ষণ করে 1 এবং এই আইএমও ব্যবহার করার সামান্য কারণ ছেড়ে দেয় long

আপনি যদি এমন কোনও আকার চান যা আপনার 32-বিট আকারের হয় তবে আপনার ব্যবহার করা উচিত int32_t

আপনি যদি এমন কোনও আকার চান যা পয়েন্টারের সমান আকারের হয় তবে আপনার ব্যবহার করা উচিত intptr_t(বা আরও ভাল uintptr_t)।

আপনি যদি এমন এক ধরণের চান যা সবচেয়ে বড় আইটেম যাতে একক নিবন্ধ / নির্দেশিকায় কাজ করা যায় তবে দুর্ভাগ্যক্রমে আমি মনে করি না যে মানটি একটি সরবরাহ করে। size_tবেশিরভাগ সাধারণ প্ল্যাটফর্মগুলিতে ডান হওয়া উচিত তবে এটি এক্স 32 এ হবে না ।


দ্রষ্টব্য

আমি "দ্রুত" বা "কমপক্ষে" প্রকারের সাথে বিরক্ত করব না। "ন্যূনতম" প্রকারগুলি কেবল তখনই গুরুত্বপূর্ণ যদি আপনি যেখানে সত্যই অস্পষ্ট আর্কিটেকচারের পোর্টেবলিবিলিটি সম্পর্কে চিন্তা করেন CHAR_BIT != 8। অনুশীলনে "দ্রুত" প্রকারের আকারটি বেশ স্বেচ্ছাসেবী বলে মনে হয়। লিনাক্স তাদের কমপক্ষে পয়েন্টার হিসাবে একই আকারে তৈরি করবে বলে মনে হচ্ছে, যা এক্স 86৪-বিট সমর্থন সহ এক্স ৮ x- বিট এবং আর্ম 64৪ এর মতো fast৪-বিট প্ল্যাটফর্মগুলিতে মূর্খ। আইআইআরসি আইওএস এগুলিকে যথাসম্ভব ছোট করে তোলে। আমি নিশ্চিত না যে অন্যান্য সিস্টেমগুলি কী করে।


PPS

ব্যবহারের একটি কারণ unsigned long(তবে সরল নয় long) কারণ এটি মডুলোর আচরণের গ্যারান্টেড। দুর্ভাগ্যক্রমে সি এর স্ক্রুযুক্ত প্রচারের নিয়মের কারণে স্বাক্ষরযুক্ত প্রকারের চেয়ে ছোট intমডুলোর আচরণ নেই।

সমস্ত বড় প্ল্যাটফর্মে আজ uint32_tএকই আকার বা ইন্টের চেয়ে বড় এবং তাই মডিউলগুলির আচরণ রয়েছে। তবে historতিহাসিকভাবে এখানে রয়েছে এবং তাত্ত্বিকভাবে ভবিষ্যতের প্ল্যাটফর্মগুলিতে এমন থাকতে পারে যেখানে int64৪-বিট রয়েছে এবং তাই uint32_tমডুলোর আচরণ নেই।

ব্যক্তিগতভাবে আমি বলব যে আপনার সমীকরণের শুরুতে "1u *" বা "0u +" ব্যবহার করে মডুলো আচরণ জোর করার অভ্যাসে ফেলা ভাল কারণ এটি স্বাক্ষরযুক্ত স্বাক্ষরের যে কোনও আকারের কাজ করবে।


1
বিল্ট-ইন ধরণের থেকে পৃথক পৃথক শব্দার্থবিজ্ঞান নির্দিষ্ট করতে পারলে সমস্ত "নির্দিষ্ট আকারের" প্রকারের আরও অনেক বেশি কার্যকর হবে। উদাহরণস্বরূপ, "টাইপ" এর আকার নির্বিশেষে Mod-65536 গাণিতিক ব্যবহার করবে এমন এক ধরণেরটি ব্যবহার করা কার্যকর হবে, পাশাপাশি এমন এক ধরণের যা 0 থেকে 65535 নম্বর ধরে রাখতে সক্ষম হবে তবে অবিচ্ছিন্নভাবে অবিচ্ছিন্নভাবে সক্ষম হতে পারে না এর চেয়ে বড় সংখ্যা ধরে রাখার। কোন মেশিনের ধরণটি সবচেয়ে মেশিনে দ্রুততম তা প্রসঙ্গের উপর নির্ভর করে, তাই সংযোজককে নির্বিচারে বাছাই করতে সক্ষম হওয়া গতির জন্য অনুকূল হতে পারে।
সুপারক্যাট

204

আপনি আপনার প্রশ্নে যেমন উল্লেখ করেছেন, আধুনিক সফ্টওয়্যার হ'ল ইন্টারনেটে প্ল্যাটফর্ম এবং সিস্টেমগুলির মধ্যে আন্তঃব্যবস্থাপনা সম্পর্কে। সি এবং সি ++ মান দিতে রেঞ্জ , না নির্দিষ্ট মাপ (জাভা এবং C # মত ভাষার সঙ্গে বিপরীতে) পূর্ণসংখ্যা টাইপ মাপ জন্য।

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

প্রবেশ করুন <cstdint>যা হুবহু এটি সরবরাহ করে এবং একটি স্ট্যান্ডার্ড শিরোনাম যা সমস্ত সংকলক এবং স্ট্যান্ডার্ড লাইব্রেরি প্ল্যাটফর্ম সরবরাহ করতে হবে। দ্রষ্টব্য: এই শিরোনামটি কেবলমাত্র C ++ 11 হিসাবে প্রয়োজনীয় ছিল, তবে বহু পুরানো গ্রন্থাগার বাস্তবায়ন যাহাই হউক না কেন এটি সরবরাহ করে।

একটি 64 বিট স্বাক্ষরবিহীন পূর্ণসংখ্যা চান? ব্যবহার uint64_t। 32 বিট পূর্ণসংখ্যায় স্বাক্ষরিত? ব্যবহার int32_t। শিরোনামের ধরণগুলি বৈকল্পিক হলেও, আধুনিক প্ল্যাটফর্মগুলিতে সেই শিরোনামে সংজ্ঞায়িত সমস্ত ধরণের সমর্থন করা উচিত।

কখনও কখনও একটি নির্দিষ্ট বিট প্রস্থ প্রয়োজন হয়, উদাহরণস্বরূপ, অন্যান্য সিস্টেমের সাথে যোগাযোগের জন্য ব্যবহৃত ডেটা স্ট্রাকচারে। অন্য সময় হয় না। কম কঠোর পরিস্থিতির জন্য, <cstdint>এমন ন্যূনতম প্রস্থের প্রকারগুলি সরবরাহ করে।

আছে অন্তত রূপগুলো: int_leastXX_tন্যূনতম এক্সএক্স বিট একটি পূর্ণসংখ্যা টাইপ হবে। এটি ক্ষুদ্রতম প্রকারটি ব্যবহার করবে যা XX বিট সরবরাহ করে তবে প্রকারটি নির্দিষ্ট সংখ্যক বিটের চেয়ে বড় হতে পারে। অনুশীলনে, এগুলি সাধারণত উপরে বর্ণিত ধরণের মতো যা বিটগুলির সঠিক সংখ্যা দেয়।

এছাড়াও রয়েছে ফাস্ট রূপগুলো: int_fastXX_tঅন্তত এক্সএক্স বিট, কিন্তু একটি যে ধরনের একটি নির্দিষ্ট প্ল্যাটফর্মে ফাস্ট সঞ্চালিত ব্যবহার করা উচিত। এই প্রসঙ্গে "দ্রুত" সংজ্ঞাটি অনির্ধারিত। যাইহোক, অনুশীলনে, এর সাধারণত অর্থ হ'ল সিপিইউর নিবন্ধের আকারের চেয়ে ছোট একটি প্রকারের সিপিইউর রেজিস্ট্রার আকারের একধরণের নাম থাকতে পারে। উদাহরণস্বরূপ, ভিজ্যুয়াল সি ++ 2015 এর শিরোনামটি int_fast16_t32 বিট পূর্ণসংখ্যা নির্দিষ্ট করে কারণ 32 বিট পাটিগণিত 16 বিটের পাটিগণিতের চেয়ে x86 এর উপরে সামগ্রিকভাবে দ্রুত।

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

হ্যাঁ, longআধুনিক সি ++ কোড থেকে নিষিদ্ধ করা উচিত। তাই করা উচিত int, shortএবং long long


20
আমি আশা করি এটিকে আরও কিছুতে ভোট দেওয়ার জন্য আমার আরও পাঁচটি অ্যাকাউন্ট রয়েছে।
স্টিভেন বার্নাপ

4
+1, আমি কিছু অদ্ভুত স্মৃতি ত্রুটিগুলি নিয়ে কাজ করেছি যা কেবল তখনই ঘটে যখন আপনি কোন কম্পিউটারটি সংকলন করছেন তার উপর কোনও স্ট্রাক্টের আকার নির্ভর করে।
জোশুয়া স্নাইডার

9
@ উইল্ডকার্ড এটি একটি সি শিরোনাম যা সি ++ এরও একটি অংশ: এটিতে "গ" উপসর্গটি দেখুন। সি ++ সংকলন ইউনিটে stdযখন নাম স্পেসে টাইপডেফগুলি রাখার কিছু উপায় রয়েছে #includeতবে আমি যে ডকুমেন্টটি সংযুক্ত করেছি সেগুলিতে এটি উল্লেখ করা হয়নি এবং ভিজুয়াল স্টুডিওতে আমি কীভাবে এগুলি ব্যবহার করব সেদিকে খেয়াল রাখেনি বলে মনে হয়।

11
নিষিদ্ধ intহতে পারে ... অতিরিক্ত? (কোডটি যদি সমস্ত অস্পষ্ট (এবং এতটা অস্পষ্ট নয়) প্ল্যাটফর্মগুলির মধ্যে অত্যন্ত পোর্টেবল হওয়ার দরকার হয় তবে আমি এটি বিবেচনা করব "" অ্যাপ কোড "এর জন্য এটি নিষিদ্ধ করা আমাদের ডিভসের সাথে খুব ভাল না বসতে পারে
মার্টিন বা Ba

5
@Snowman #include <cstdint>হয় প্রয়োজনীয় ধরনের লাগাতে std::এবং (আফসোস) ঐচ্ছিকভাবে অনুমতি তাদের বিশ্বব্যাপী নামস্থান করা এছাড়াও। #include <stdint.h>ঠিক কথোপকথন। এটি অন্য যে কোনও সি সি হেডারগুলির ক্ষেত্রে প্রযোজ্য। দেখুন: স্ট্যাকওভারফ্লো.com / a / 13643019 / 2757035 আমি আশা করি স্ট্যান্ডার্ডটি কেবলমাত্র কিছু বাস্তবায়ন দ্বারা প্রতিষ্ঠিত দরিদ্র কনভেনশনগুলিতে আপাতদৃষ্টিতে বকবক করার পরিবর্তে কেবলমাত্র তার নিজের প্রয়োজনীয় নামের জায়গার উপর প্রভাব ফেলবে - তবে ওহ ভাল, আমরা এখানে আছি।
আন্ডারস্কোর_

38

না, অন্তর্নির্মিত পূর্ণসংখ্যার ধরণের নিষেধাজ্ঞাই অবাস্তব। তবে তাদের আপত্তি করা উচিত নয়।

আপনি একটি পূর্ণসংখ্যা যে প্রয়োজন ঠিক এন বিট প্রশস্ত, ব্যবহার (অথবা আপনি একটি প্রয়োজন হলে সংস্করণ)। 32 বিট পূর্ণসংখ্যার হিসাবে এবং bit৪ বিট পূর্ণসংখ্যার হিসাবে চিন্তা করা ঠিক ভুল। আপনার বর্তমান প্ল্যাটফর্মগুলিতে এটি এমন হতে পারে তবে এটি বাস্তবায়ন-সংজ্ঞায়িত আচরণের উপর নির্ভর করে।std::intN_tstd::uintN_tunsignedintlong long

নির্দিষ্ট-প্রস্থের পূর্ণসংখ্যার প্রকারগুলি অন্যান্য প্রযুক্তির সাথে আন্তঃ অপারেটিংয়ের জন্যও কার্যকর। উদাহরণস্বরূপ, যদি আপনার অ্যাপ্লিকেশনটির কিছু অংশ জাভাতে লেখা থাকে এবং অন্যদের সি ++ তে লেখা থাকে তবে আপনি সম্ভবত পূর্ণসংখ্যার প্রকারগুলি মেলাতে চাইবেন যাতে আপনি ধারাবাহিক ফলাফল পান। (তবুও সচেতন থাকুন যে জাভাতে ওভারফ্লো সুবিন্যস্ত শব্দার্থবিজ্ঞান রয়েছে তবে signedসি ++ এ ওভারফ্লো অপরিজ্ঞাত আচরণ তাই ধারাবাহিকতা একটি উচ্চ লক্ষ্য)) বিভিন্ন কম্পিউটিং হোস্টের মধ্যে ডেটা বিনিময় করার সময় এগুলিও অমূল্য হবে।

আপনার যদি ঠিক হ'ল এন বিটগুলির প্রয়োজন না হয় তবে কেবলমাত্র এক প্রকার যা যথেষ্ট প্রশস্ত , ব্যবহার করার কথা বিবেচনা করুন (স্থানের জন্য অনুকূলিত) বা (গতির জন্য অনুকূলিত)। আবার, উভয় পরিবারেরও অংশ রয়েছে ।std::int_leastN_tstd::int_fastN_tunsigned

তো, অন্তর্নির্মিত প্রকারগুলি কখন ব্যবহার করবেন? ঠিক আছে, যেহেতু স্ট্যান্ডার্ডটি তাদের প্রস্থটি সুনির্দিষ্টভাবে নির্দিষ্ট করে না, আপনি যখন প্রকৃত বিটের প্রস্থের জন্য নয় তবে অন্যান্য বৈশিষ্ট্যগুলির বিষয়ে চিন্তা করবেন না তখন সেগুলি ব্যবহার করুন ।

একটি charহ'ল ক্ষুদ্রতম পূর্ণসংখ্যা যা হার্ডওয়্যার দ্বারা চিহ্নিত করা যায়। ভাষাটি আপনাকে এটিকে স্বেচ্ছাসেবী স্মৃতি থেকে দূরে রাখতে ব্যবহার করতে বাধ্য করে। এটি সরু (সংকীর্ণ) চরিত্রের স্ট্রিংগুলি উপস্থাপনের জন্য একমাত্র কার্যকর ধরণের।

একটি intসাধারণত মেশিনটি পরিচালনা করতে পারে এমন দ্রুততম ধরণ হবে। এটি যথেষ্ট প্রশস্ত হবে যে এটি একটি একক নির্দেশাবলীতে (কোনও মাস্ক বা শিফ্ট বিট না করে) লোড করে সংরক্ষণ করা যায় এবং যথেষ্ট সংকীর্ণ হয় যাতে এটি (সর্বাধিক) দক্ষ হার্ডওয়্যার নির্দেশাবলীর সাহায্যে পরিচালনা করা যায়। সুতরাং, intওভারফ্লো যখন উদ্বেগের বিষয় নয় তখন ডেটা পাস এবং পাটিগণিত করার জন্য উপযুক্ত পছন্দ। উদাহরণস্বরূপ, গণনার ডিফল্ট অন্তর্নিহিত প্রকার int। এটিকে 32 বিট পূর্ণসংখ্যায় পরিবর্তন করবেন না কারণ কেবল আপনি পারেন। এছাড়াও, আপনার যদি এমন কোনও মান থাকে যা কেবলমাত্র –1, 0 এবং 1 হতে পারে, একটিintএকটি নিখুঁত পছন্দ, যদি না আপনি তাদের মধ্যে বিশাল অ্যারে সঞ্চয় করতে যাচ্ছেন তবে আপনি স্বতন্ত্র উপাদানগুলিতে অ্যাক্সেসের জন্য আরও বেশি দামের ব্যয় করে আরও কমপ্যাক্ট ডেটা টাইপ ব্যবহার করতে চাইতে পারেন। আরও দক্ষ ক্যাচিং সম্ভবত এর জন্য অর্থ প্রদান করবে। অনেক অপারেটিং সিস্টেম ফাংশন এছাড়াও শর্তাবলী সংজ্ঞায়িত করা হয় int। তাদের যুক্তি এবং ফলাফলগুলি পিছনে পিছনে রূপান্তর করা নির্বোধ হবে। এগুলি সম্ভবত ওভারফ্লো ত্রুটিগুলি প্রবর্তন করতে পারে introduce

longএকক মেশিনের নির্দেশাবলীর সাহায্যে পরিচালনা করা যেতে পারে এমন প্রস্থটি সাধারণত হবে। এটি unsigned longকাঁচা ডেটা এবং সমস্ত ধরণের বিট ম্যানিপুলেশন স্টাফের সাথে কাজ করার জন্য বিশেষত খুব আকর্ষণীয় করে তোলে । উদাহরণস্বরূপ, আমি unsigned longএকটি বিট-ভেক্টর বাস্তবায়নে দেখতে আশা করব would কোডটি যদি মনোযোগ সহকারে লেখা হয় তবে প্রকৃতপক্ষে প্রকারটি কত বিস্তৃত তা বিবেচ্য নয় (কারণ কোডটি স্বয়ংক্রিয়ভাবে মানিয়ে নেবে)। প্ল্যাটফর্মগুলিতে যেখানে নেটিভ মেশিন-শব্দটি 32 বিট, বিট-ভেক্টরটির ব্যাকিং অ্যারে এর অ্যারে হতে পারেunsigned32 বিট পূর্ণসংখ্যার সর্বাধিক আকাঙ্ক্ষিত কারণ এটি কোনও bit৪ বিট প্রকারের ব্যবহারের জন্য মূর্খ হবে যা কেবল ব্যয়বহুল বিটগুলি আবার স্থানান্তর করতে এবং মাস্ক করার জন্য ব্যয়বহুল নির্দেশাবলীর মাধ্যমে লোড করতে হবে। অন্যদিকে, যদি প্ল্যাটফর্মের নেটিভ শব্দের আকার bit৪ বিট হয় তবে আমি সেই ধরণের একটি অ্যারে চাই কারণ এর অর্থ "ফাইন্ড ফার্স্ট সেট" এর মতো অপারেশন দ্বিগুণ দ্রুত গতিতে চলতে পারে। সুতরাং longআপনি যে ধরণের ডেটা টাইপের বর্ণনা দিচ্ছেন তার "সমস্যা" , এর আকার প্ল্যাটফর্ম থেকে প্ল্যাটফর্মের মধ্যে পরিবর্তিত হয়, এমন একটি বৈশিষ্ট্য যা ভাল ব্যবহারে রাখা যায়। এটি কেবল তখনই সমস্যা হয়ে দাঁড়ায় যদি আপনি অন্তর্নির্মিত প্রকারগুলি নির্দিষ্ট বিট প্রস্থের প্রকারের মতো ভাবেন, যা তারা সহজভাবে করেন না।

char, intএবং longউপরে বর্ণিত হিসাবে খুব দরকারী ধরণের। shortএবং long longপ্রায় হিসাবে দরকারী না কারণ তাদের শব্দার্থবিজ্ঞান অনেক কম স্পষ্ট।


4
ওপি বিশেষত longউইন্ডোজ এবং ইউনিক্সের আকারের পার্থক্যটি ডেকেছে । আমি ভুল বুঝতে পারি, তবে আপনার long"সমস্যা" এর পরিবর্তে "বৈশিষ্ট্য" হওয়ার আকারের পার্থক্যের বিবরণটি 32 এবং 64 বিট ডেটা মডেলের তুলনা করার জন্য আমার কাছে বোধগম্য, তবে এই বিশেষ তুলনার জন্য নয়। বিশেষ ক্ষেত্রে এই প্রশ্নটি সম্পর্কে জিজ্ঞাসা করা হয়েছে, এটি কি আসলেই কোনও বৈশিষ্ট্য? অথবা এটি অন্যান্য পরিস্থিতিতে (যা সাধারণভাবে) কোনও বৈশিষ্ট্য এবং এই ক্ষেত্রে নিরীহ?
ড্যান গেটেজ

3
@ 5gon12eder: সমস্যাটি হ'ল uint32_t এর মতো প্রকারগুলি কোডের আচরণ "INT" আকারের থেকে পৃথক হতে দেওয়ার উদ্দেশ্যে তৈরি করা হয়েছিল, তবে এমন ধরণের অভাব যার অর্থ "uint32_t এর মতো আচরণ করবে 32- তে কাজ করে? বিট সিস্টেম "রাইটিং কোড তৈরি করে যার আচরণ" ইনট "এর আকারের সাথে সঠিকভাবে স্বতন্ত্র যা লেখার কোডের চেয়ে প্রায় শক্ত which
সুপারক্যাট

3
হ্যাঁ, আমি জানি ... এখানেই অভিশাপ এসেছে। মূল লেখকরা ইজারা প্রতিরোধের পথ অবলম্বন করেছেন কারণ তারা কোডটি লেখার সময় 32-বিট ওএসএস এক দশক পেরিয়েছিল।
স্টিভেন বার্নাপ

8
@ 5gon12eder দুঃখজনকভাবে, সুপারক্যাটটি সঠিক। সঠিক-চওড়া ধরনের সব কটি হল "শুধু typedefs" এবং পূর্ণসংখ্যা প্রচার নিয়ম তাদের কোন নোটিশ, যার মানে উপর গাণিতিক নিতে uint32_tমান হিসাবে সম্পন্ন করা হবে স্বাক্ষর , intএকটি প্ল্যাটফর্ম যেখানে উপর -width গাণিতিক intহয় ব্যাপকতর চেয়ে uint32_t। (আজকের এবিআইতে এটি অপ্রতিরোধ্যভাবে সমস্যা হওয়ার সম্ভাবনা বেশি uint16_t।)
zwol

9
1 ম, বিস্তারিত উত্তরের জন্য ধন্যবাদ। কিন্তু: ওহে প্রিয়। আপনার দীর্ঘ অনুচ্ছেদ: " longসাধারণত বিস্তৃত যে ধরনের একক মেশিন নির্দেশাবলী সহ পরিচালনা করা হতে পারে হবে ...।" - এবং এই ঠিক ভুল । উইন্ডোজ ডেটা মডেল দেখুন। আইএমএইচও, আপনার সম্পূর্ণ নিম্নলিখিত উদাহরণটি ভেঙে গেছে, কারণ x64 উইন্ডোজ দীর্ঘ এখনও 32 বিট।
মার্টিন বা

6

আরেকটি উত্তর ইতিমধ্যে cstdint প্রকারের এবং এর মধ্যে কম-পরিচিত বিচিত্রতার বিষয়ে বিস্তারিত জানায়।

আমি এতে যুক্ত করতে চাই:

ডোমেন-নির্দিষ্ট ধরণের নাম ব্যবহার করুন

এটি হ'ল, আপনার প্যারামিটারগুলি এবং ভেরিয়েবলগুলি uint32_t(অবশ্যই নয় long!) হিসাবে ঘোষণা করবেন না , তবে নামগুলি channel_id_type, room_count_typeইত্যাদি

গ্রন্থাগার সম্পর্কে

তৃতীয় পক্ষের গ্রন্থাগারগুলি যা ব্যবহার করে longবা হোয়াইটন্ট বিরক্তিকর হতে পারে, বিশেষত যদি সেগুলিতে রেফারেন্স বা পয়েন্টার হিসাবে ব্যবহৃত হয়।

সবচেয়ে ভাল জিনিসটি মোড়ক তৈরি করা হয়।

আমার কৌশলটি কী, সাধারণভাবে, কাস্ট-জাতীয় ফাংশনগুলির একটি সেট তৈরি করা হবে যা ব্যবহৃত হবে। আপনার কেবলমাত্র প্রকারগুলিই গ্রহণ করতে ওভারলোড করা হয়েছে যা আপনার প্রয়োজনীয় পয়েন্টার ইত্যাদির সাথে বিভিন্ন প্রকারের সাথে ঠিক একইভাবে মেলে। এগুলি ওএস / সংকলক / সেটিংসের সাথে নির্দিষ্ট করে সংজ্ঞায়িত করা হয়। এটি আপনাকে সতর্কতাগুলি সরাতে এবং তবুও নিশ্চিত করতে পারে যে কেবলমাত্র "ডান" রূপান্তর ব্যবহৃত হয়েছে।

channel_id_type cid_out;
...
SomeLibFoo (same_thing_really<int*>(&cid_out));

বিশেষত, বিভিন্ন আদিম ধরণের 32 টি বিট উত্পাদন করে, কীভাবে int32_tসংজ্ঞায়িত করা হয় তা আপনার পছন্দটি লাইব্রেরির কলটির সাথে মেলে না (যেমন উইন্ডোতে ইন্ট বনাম দীর্ঘ)।

কাস্ট-মত ফাংশন সংঘর্ষের নথি দেয়, ফাংশনের প্যারামিটারের সাথে মেলে ফলাফলটি সংকলন-সময় যাচাইয়ের জন্য সরবরাহ করে এবং কোনও সতর্কতা বা ত্রুটি অপসারণ করে এবং যদি প্রকৃত প্রকারটি প্রকৃত আকারের সাথে মেলে তবেই । এটি, এটি ওভারলোডেড এবং সংজ্ঞায়িত করা হয় যদি আমি (উইন্ডোজে) একটি int*বা এ পাস করি long*এবং অন্যথায় একটি সংকলন-সময় ত্রুটি দিই ।

সুতরাং, যদি গ্রন্থাগারটি আপডেট করা হয় বা কেউ যা পরিবর্তন channel_id_typeকরে তবে এটি যাচাই করা অবিরত থাকে।


ডাউনভোট (মন্তব্য না করে) কেন?
জেডুগোস্জ 9'13

কারণ এই নেটওয়ার্কের বেশিরভাগ ডাউনভিটগুলি কোনও মন্তব্য ছাড়াই উপস্থিত হয় ...
রুস্লান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.