Uint_fast32_t কী এবং কেন এটি নিয়মিত int এবং uint32_t এর পরিবর্তে ব্যবহার করা উচিত?


110

সুতরাং এর কারণ typedef: এড আদিম ডাটা টাইপগুলি হ'ল নিম্ন-স্তরের উপস্থাপনাকে বিমূর্ত করা এবং এটি বোঝা সহজ করে ( টাইপের uint64_tপরিবর্তে long long, যা 8 বাইট)।

যাইহোক, uint_fast32_tযা আছে typedefহিসাবে একই আছে uint32_t। "দ্রুত" সংস্করণ ব্যবহার করা কি প্রোগ্রামটিকে আরও দ্রুততর করবে?


দীর্ঘ দীর্ঘ 8 বাইট নয়, দীর্ঘ 1 বাইট (CHAR_BIT ন্যূনতম 64 হয়) বা 3738383 বাইট সহ দীর্ঘ দীর্ঘ হওয়া সম্ভব। এছাড়াও uint64_t 1,2,4 বা 8 বাইট হতে পারে, তার জন্য CHAR_BIT অবশ্যই 64, 3, 16 বা 8 হওয়া উচিত।
12431234123412341234123

উত্তর:


134
  • intকিছু প্ল্যাটফর্মে 16 বিটের মতো ছোট হতে পারে। এটি আপনার আবেদনের জন্য পর্যাপ্ত নাও হতে পারে।
  • uint32_tঅস্তিত্বের নিশ্চয়তা নেই। এটি একটি typedefalচ্ছিক যা বাস্তবায়ন অবশ্যই প্রদান করতে পারে যদি এটিতে স্বাক্ষরবিহীন পূর্ণসংখ্যার ধরণের 32-বিট থাকে। কারও কারও কাছে 9-বিট বাইট রয়েছে উদাহরণস্বরূপ, তাদের কাছে একটি নেই uint32_t
  • uint_fast32_tআপনার উদ্দেশ্যটি স্পষ্টভাবে জানিয়েছে: এটি কমপক্ষে 32 বিটের এক ধরণের যা পারফরম্যান্স পয়েন্ট অফ ভিউ থেকে সেরা। uint_fast32_tআসলে 64 বিট দীর্ঘ হতে পারে। এটি বাস্তবায়নের উপর নির্ভর করে।

... এখানে uint_fast32_tযা টাইপফের মতো একই uint32_t...

আপনি যা দেখছেন তা মানক নয়। এটি একটি নির্দিষ্ট বাস্তবায়ন (ব্ল্যাকবেরি)। সুতরাং আপনি সেখান থেকে অনুমান করতে পারবেন না uint_fast32_tযা সর্বদা একই রকম uint32_t

আরো দেখুন:


35
ভাল উত্তর. সম্পূর্ণতার জন্য, কেউ খুব সম্ভবত পার্থক্যটিও নির্দেশ করতে পারে uint_least32_t, uint_fast32_tএটি গতির চেয়ে ছোট স্টোরের পক্ষে ব্যতীত একই ।
দামন

2
অন্তত 32-বিট প্রস্থের দ্রুততম পূর্ণসংখ্যা 32-বিটের চেয়ে বড় হবে কেন? আমি সর্বদা ভাবতাম যদি কম বিট থাকে তবে কম বিট হবে সিপিইউতে কাজ করতে হবে, এইভাবে দ্রুত। আমি এখানে কি মিস করছি?
শেন শুু

12
@ শানেহসু: বলুন একটি 64৪-বিট সিপিইউতে একটি 64৪-বিট বিট গ্রীষ্ম হবে, যা একটি চক্রের 64৪-বিট সংখ্যার যোগফল। আপনি যা করতে চান তা 32-বিট সংখ্যাগুলিতে কাজ করা উচিত তা বিবেচ্য নয়, এটি একটি চক্রের চেয়ে দ্রুততর হবে না। এখন, যদিও এটি x86 / amd64 তে তেমন কিছু না, 32-বিট পূর্ণসংখ্যার এমনকি ঠিকঠাক নাও হতে পারে। এ জাতীয় ক্ষেত্রে তাদের সাথে কাজ করার জন্য 32-বিটগুলি থেকে 64-বিট প্রান্তিককরণ ইউনিটগুলি নিষ্কাশনের জন্য অতিরিক্ত অপস প্রয়োজন। লিঙ্কিত প্রশ্নটি দেখুন। সি ++ স্ট্যান্ডার্ডটি এমনভাবে লেখা হয়েছে যাতে এটি এমন কোনও মেশিনে কাজ করতে পারে যার মধ্যে 37-বিট শব্দ রয়েছে ... সুতরাং সেখানে 32-বিট টাইপ নেই।
ইয়াকভ গালকা

42

পার্থক্যটি তাদের সঠিক-নেস এবং উপলব্ধতার মধ্যে রয়েছে lies

এখানে ডক বলেছেন:

প্রস্থ সঙ্গে স্বাক্ষরবিহীন পূর্ণসংখ্যা টাইপ ঠিক 8, 16, 32 এবং 64 বিট যথাক্রমে ( প্রদত্ত শুধুমাত্র যদি বাস্তবায়ন সরাসরি টাইপ সমর্থন ):

uint8_t
uint16_t
uint32_t
uint64_t

এবং

যথাক্রমে কমপক্ষে 8, 16, 32 এবং 64 বিটের প্রস্থ সহ দ্রুত স্বাক্ষরবিহীন স্বাক্ষরযুক্ত পূর্ণসংখ্যা টাইপ

uint_fast8_t
uint_fast16_t
uint_fast32_t
uint_fast64_t    

সুতরাং পার্থক্যটি বেশ স্পষ্ট যে এটি uint32_tএমন এক ধরণের যা ঠিক 32 বিটস রয়েছে এবং একটি বাস্তবায়ন কেবলমাত্র তখনই প্রদান করতে হবে যখন এটি ঠিক 32 বিটের সাথে টাইপ করে এবং তারপরে এটি টাইপটি টাইপ করতে পারে uint32_t। এর অর্থ, উপলব্ধuint32_t বা নাও থাকতে পারে ।

অন্যদিকে, uint_fast32_tএকটি টাইপ যা আছে অন্তত 32 বিট, যা মানে, যদি একটি বাস্তবায়ন typedef পারে uint32_tযেমন uint_fast32_t যদি এটি উপলব্ধ করা uint32_t। যদি এটি সরবরাহ না করে uint32_tতবে uint_fast32_tকমপক্ষে 32বিট রয়েছে এমন কোনও ধরণের টাইপডেফ হতে পারে ।


3
তবে কী কারণ যা uint32_t এর তুলনায় uint_fast32_t দ্রুত করে তোলে? কেন এটি দ্রুত?
ডেস্ট্রাক্টর

2
@ প্রবাসীমিট: সমস্ত পূর্ণসংখ্যা একইভাবে অ্যাক্সেস করা যায় না। কিছু অন্যের চেয়ে অ্যাক্সেস করা সহজ। সহজ মানে হ'ল কম-গণনা, আরও সরাসরি, যার ফলে দ্রুত অ্যাক্সেস হয়। এখন uint32_tসমস্ত সিস্টেমে হুবহু 32-বিট রয়েছে (যদি এটি বিদ্যমান থাকে) যা সম্ভবত এটির তুলনায় দ্রুত নাও হতে পারে, বলুন, 64-বিট। uint_fast32_tঅন্যদিকে কমপক্ষে 32 বিট, এমনকি 64-বিট হতে পারে।
নওয়াজ

10
@ পরিচালক: কিছু প্রসেসরের ক্ষেত্রে, যদি কোনও ভেরিয়েবল দীর্ঘতর কোনও রেজিস্টারে সংরক্ষণ করে, সংকলকটিকে কোনও অতিরিক্ত বিট লুপ করতে অতিরিক্ত কোড যুক্ত করতে হতে পারে। উদাহরণস্বরূপ, যদি uint16_t x;এআরএম 7-টিডিএমআই-তে 32-বিট রেজিস্টারে জমা হয় তবে কোডটি x++;মূল্যায়ন করার প্রয়োজন হতে পারে x=((x+1)<<16)>>16);। এই প্ল্যাটফর্মের সংকলকগুলিতে, uint_fast16_tসম্ভবত এটি uint32_tএড়াতে সমার্থক হিসাবে সংজ্ঞায়িত করা হবে ।
সুপারক্যাট

কেন [u]int_(fast|least)N_tal চ্ছিক হয় না? কমপক্ষে 64৪ বিটের আদিম ধরণের সমর্থন করার জন্য স্ট্যান্ডার্ডের দ্বারা সমস্ত আর্কিটেকচারের প্রয়োজনীয়তা নেই? তবুও শব্দটি stdint.hবোঝায় যে তাদের অবশ্যই আবশ্যক। এটি আমার কাছে অদ্ভুত বলে মনে হচ্ছে যে আমরা ১৯৯৯ সাল থেকে 64৪-বিট কম্পিউটিংয়ের মূলধারায় পরিণত হওয়ার কয়েক বছর আগে - এম্বেডেড আর্কিটেকচারের পিছনে (অনেক ক্ষেত্রে এখনও বর্তমান) পিছনে কিছুই না বলে। এটি আমার কাছে বড় পর্যবেক্ষণ বলে মনে হচ্ছে।
আন্ডারস্কোর_

1
@ মাউন্ডস_ডি: কোনও নির্দিষ্ট কারণ নেই, উদাহরণস্বরূপ, স্ট্যান্ডার্ডটি পিআইসি 12 বাস্তবায়নের জন্য প্রযোজ্য হতে পারে না যাতে 256 নির্দেশাবলীর জন্য ডেটা র্যাম এবং স্পেসের 16 বাইট রয়েছে। এই ধরনের বাস্তবায়নের জন্য প্রচুর প্রোগ্রাম প্রত্যাখ্যান করা প্রয়োজন, তবে এটি যে প্রোগ্রামগুলির প্রয়োজনগুলি পূরণ করতে পারে তাদের সংজ্ঞায়িত ফ্যাশনে আচরণ করা থেকে বিরত রাখা উচিত নয়।
ক্যাট

4

আপনি যখন #include inttypes.hআপনার প্রোগ্রামে থাকেন, আপনি পূর্ণসংখ্যার প্রতিনিধিত্ব করার জন্য বিভিন্ন উপায়ে একটি গোছায় অ্যাক্সেস পান।

Uint_ ব্রেকফাস্ট * _t প্রকারটি প্রদত্ত সংখ্যক বিট উপস্থাপনের জন্য দ্রুততম ধরণের সংজ্ঞা দেয়।

এটি এইভাবে চিন্তা করুন: আপনি টাইপের একটি পরিবর্তনশীল সংজ্ঞায়িত shortকরেন এবং প্রোগ্রামে এটি বেশ কয়েকবার ব্যবহার করেন যা সম্পূর্ণ বৈধ। তবে, আপনি যে সিস্টেমে কাজ করছেন সেটি ধরণের মানগুলির সাথে আরও দ্রুত কাজ করতে পারে int। ভেরিয়েবলকে টাইপ হিসাবে সংজ্ঞায়িত uint_fast*tকরে কম্পিউটারটি সবচেয়ে কার্যকর উপস্থাপনাটি বেছে নেয় যা এটি দিয়ে কাজ করতে পারে।

যদি এই উপস্থাপনাগুলির মধ্যে কোনও পার্থক্য না থাকে, তারপরে সিস্টেমটি যেকোনটি বেছে নেয় এবং এটি পুরোপুরি ধারাবাহিকভাবে ব্যবহার করে।


9
কেন inttyype.h এবং stdint.h না? এটি দেখে মনে হচ্ছে যে inttyype.h এ কেবল বিভিন্ন মৃদু উপকারী ফ্লাফ রয়েছে, এবং এর সাথে একটি স্টাডিন্টের অন্তর্ভুক্ত রয়েছে?
লন্ডিন

@undcore_d আমি পার্থক্য জানি। কিন্তু পেশাদার প্রোগ্রামগুলিতে কে স্টডিও এইচ ব্যবহার করে, প্রয়োগের ক্ষেত্র কোনও বিষয় নয়?
লন্ডিন

@ লন্ডিন আমি জানি না তারা কে, বা তাদের বিদ্যমান কিনা! আমি এটা কি যে "আস্তে দরকারী উচ্চারণ ভুল" হয় ;-) সম্ভবত এটা মানুষ তুমি ডান উপলব্ধি করা এবং তারা সাহায্য করব উপর elaborating লিংক দিতে সহায়ক হতে পারে চিন্তা না এটি প্রয়োজন।
আন্ডারস্কোর_ডি

-1

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

আমি মনে করি না যে আধুনিক সিপিইএস দ্রুত_আইএনটি 32 এর দ্বারা উপকৃত হবে, যেহেতু লোড নির্দেশের সময় সাধারণত 32 থেকে 64 বিটের প্রসারিত চিহ্নটি ঘটতে পারে এবং একটি 'নেটিভ' পূর্ণসংখ্যা বিন্যাসটি দ্রুততর হয় এটি ধারণাটি পুরানো ফ্যাশন is

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