Uint_fast32_t क्या है और इसका उपयोग नियमित int और uint32_t के बजाय क्यों किया जाना चाहिए?


110

तो इसका कारण यह है typedef: एड आदिम डेटा प्रकार निम्न-स्तरीय प्रतिनिधित्व को सार करने और इसे समझने में आसान बनाते हैं;uint64_tlong 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अस्तित्व की गारंटी नहीं है। यह एक वैकल्पिक है typedefकि कार्यान्वयन iff प्रदान करना चाहिए यदि इसमें 32-बिट्स का अहस्ताक्षरित पूर्णांक प्रकार है। कुछ के पास उदाहरण के लिए 9-बिट बाइट्स हैं, इसलिए उनके पास ए नहीं है uint32_t
  • uint_fast32_tआपके इरादे को स्पष्ट रूप से बताता है: यह कम से कम 32 बिट्स का एक प्रकार है जो प्रदर्शन के दृष्टिकोण से सबसे अच्छा है। uint_fast32_tवास्तव में 64 बिट लंबा हो सकता है। यह कार्यान्वयन तक है।

... वहाँ है uint_fast32_tजो एक ही typedef के रूप में है uint32_t...

आप जो देख रहे हैं, वह मानक नहीं है। यह एक विशेष कार्यान्वयन (ब्लैकबेरी) है। तो आप वहाँ से नहीं घटा सकते जो uint_fast32_tहमेशा की तरह है uint32_t

यह सभी देखें:


35
अच्छा उत्तर। पूर्णता के लिए, शायद कोई अंतर को uint_least32_tभी इंगित कर सकता है, जो कि uint_fast32_tगति के बजाय छोटे स्टोर के पक्ष में है।
डेमन

2
सबसे तेज पूर्णांक जो 32-बिट से बड़ा होने के लिए कम से कम 32-बिट चौड़ाई में क्यों होगा? मैंने हमेशा सोचा कि अगर कम बिट्स हैं, तो कम बिट्स होंगे सीपीयू पर काम करना होगा, इस प्रकार तेजी से। मुझे यहां क्या समझ नहीं आ रहा है?
शेन हू

12
@SHHsu: कहते हैं कि 64-बिट सीपीयू में 64-बिट गर्मी होगी, जो एक चक्र में 64-बिट संख्या में होती है। इससे कोई फर्क नहीं पड़ता कि आप जो करना चाहते हैं वह 32-बिट नंबरों पर काम करना है, यह एक चक्र से अधिक तेज नहीं है। अब, हालाँकि x86 / amd64 पर ऐसा नहीं है, 32-बिट पूर्णांक भी पता करने योग्य नहीं हो सकते हैं। ऐसे मामले में, उन पर काम करने के लिए 64-बिट संरेखित इकाइयों से 32-बिट्स निकालने के लिए अतिरिक्त ऑप्स की आवश्यकता होती है। जुड़ा हुआ प्रश्न भी देखें। C ++ मानक इसलिए लिखा जाता है ताकि वह एक ऐसी मशीन पर काम कर सके जिसमें 37-बिट शब्द हों ... इसलिए वहां कोई 32-बिट प्रकार नहीं है।
याकॉव गल्का

42

अंतर उनके सटीक-नेस और उपलब्धता में निहित है।

डॉक यहाँ का कहना है:

की चौड़ाई के साथ अहस्ताक्षरित पूर्णांक प्रकार वास्तव में 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 बिट्स होते हैं, जिसका अर्थ यह भी होता है, यदि कोई कार्यान्वयन टाइपफेड uint32_tको प्रदान करता है जैसे uint_fast32_t कि वह प्रदान करता है uint32_t। यदि यह प्रदान नहीं करता है uint32_t, तो uint_fast32_tकिसी भी प्रकार का एक टंकण हो सकता है जिसमें कम से कम 32बिट्स हों।


3
लेकिन क्या कारण है कि उदाहरण के लिए uint_fast32_t uint32_t से अधिक तेज है? यह तेज क्यों है?
विध्वंसक

2
@PravasiMeet: सभी पूर्णांकों को एक ही तरीके से एक्सेस नहीं किया गया है। कुछ को दूसरों की तुलना में आसानी होती है। आसान का मतलब कम-संगणना, अधिक प्रत्यक्ष, जिसके परिणामस्वरूप तेजी से पहुंच होती है। अब uint32_tसभी प्रणालियों (यदि मौजूद है) पर बिल्कुल 32-बिट है, जो कि 64-बिट वाले की तुलना में तेज नहीं हो सकता है। uint_fast32_tदूसरी ओर कम से कम 32 बिट, 64-बिट भी हो सकता है।
नवाज

10
@ डीस्ट्रक्टर: कुछ प्रोसेसरों पर, यदि वेरिएबल एक रजिस्टर में संग्रहित हो जाता है, जो अधिक लंबा है, तो कंपाइलर को अतिरिक्त कोड को किसी भी अतिरिक्त बिट्स को हटाने के लिए जोड़ना पड़ सकता है। उदाहरण के लिए, यदि uint16_t x;ARM7-TDMI पर 32-बिट रजिस्टर में संग्रहीत किया जाता है , तो कोड का x++;मूल्यांकन करने की आवश्यकता हो सकती है x=((x+1)<<16)>>16);। उस प्लेटफ़ॉर्म के लिए कंपाइलरों पर, uint_fast16_tसबसे अधिक संभावना होगी uint32_tकि इससे बचने के लिए पर्यायवाची के रूप में ।
सुपरकैट

[u]int_(fast|least)N_tवैकल्पिक भी क्यों नहीं हैं? निश्चित रूप से कम से कम 64 बिट्स के आदिम प्रकारों का समर्थन करने के लिए मानक द्वारा सभी आर्किटेक्चर की आवश्यकता नहीं है? फिर भी stdint.hइसका तात्पर्य यह है कि उन्हें करना चाहिए। यह मुझे अजीब लगता है कि हम इस बात को लागू कर रहे हैं कि 1999 के बाद से, 64-बिट कंप्यूटिंग से कुछ साल पहले मुख्यधारा बन गई थी - एम्बेडेड आर्किटेक्चर के उस (कुछ मामलों में अभी भी वर्तमान) पीछे कुछ भी नहीं कहने के लिए। यह मुझे एक बड़ा निरीक्षण जैसा लगता है।
अंडरस्कोर_ड

1
@underscore_d: कोई विशेष कारण नहीं है, उदाहरण के लिए, कि मानक PIC PIC के कार्यान्वयन के लिए लागू नहीं हो सकता है जिसमें 16 बाइट्स डेटा रैम और 256 निर्देशों के लिए स्थान हो। इस तरह के कार्यान्वयन को बहुत सारे कार्यक्रमों को अस्वीकार करने की आवश्यकता होगी, लेकिन यह इसे उन कार्यक्रमों के लिए परिभाषित फैशन में व्यवहार करने से नहीं रोक सकता है जिनकी आवश्यकताओं को यह संतुष्ट कर सकता है।
सुपरकैट

4

जब आप #include inttypes.hअपने कार्यक्रम में होते हैं, तो पूर्णांकों का प्रतिनिधित्व करने के लिए आपको विभिन्न तरीकों का एक गुच्छा प्राप्त होता है।

Uint_fast * _t प्रकार केवल दी गई संख्याओं के बिट्स का प्रतिनिधित्व करने के लिए सबसे तेज़ प्रकार को परिभाषित करता है।

इसके बारे में इस तरह से सोचें: आप प्रकार के एक चर को परिभाषित करते हैं shortऔर इसे प्रोग्राम में कई बार उपयोग करते हैं, जो पूरी तरह से मान्य है। हालाँकि, जिस सिस्टम पर आप काम कर रहे हैं, वह टाइप के मूल्यों के साथ अधिक तेज़ी से काम कर सकता है int। एक चर को प्रकार के रूप में परिभाषित करके uint_fast*t, कंप्यूटर केवल सबसे कुशल प्रतिनिधित्व चुनता है जो इसके साथ काम कर सकता है।

यदि इन अभ्यावेदनों में कोई अंतर नहीं है, तो सिस्टम जिसे चाहे चुन लेता है, और लगातार इसका उपयोग करता है।


9
क्यों inttypes.h और stdint.h नहीं? ऐसा लगता है कि inttypes.h में केवल विभिन्न हल्के उपयोगी फुल होते हैं, साथ ही इसमें stdint.h भी शामिल है?
लुंडिन

@underscore_d मुझे अंतर पता है। लेकिन पेशेवर कार्यक्रमों में stdio.h का उपयोग कौन करता है, अनुप्रयोग का कोई क्षेत्र नहीं?
लुंडिन

@ लुंडिन मुझे पता नहीं है कि वे कौन हैं, या क्या वे मौजूद हैं! मुझे लगा कि "हल्के से उपयोगी फ़्लफ़" क्या है, इस पर विस्तार से एक लिंक प्रदान करना उपयोगी हो सकता है; ;-) शायद यह लोगों को यह महसूस करने में मदद करेगा कि आप सही हैं और उन्हें इसकी आवश्यकता नहीं है।
अंडरस्कोर_ड

-1

ध्यान दें कि फास्ट संस्करण 32 बिट्स से बड़ा हो सकता है। जबकि फास्ट इंट एक रजिस्टर में अच्छी तरह से फिट होगा और गठबंधन किया जाएगा और जैसे: लेकिन, यह अधिक मेमोरी का उपयोग करेगा। यदि आपके पास इनमें से बड़े एरेज़ हैं तो अधिक मेमोरी कैश हिट और बैंडविड्थ के कारण आपका प्रोग्राम धीमा हो जाएगा।

मुझे नहीं लगता कि आधुनिक CPUS को fast_int32 से लाभ होगा, क्योंकि आम तौर पर 32 से 64 बिट तक फैले साइन लोड इंस्ट्रक्शन के दौरान हो सकते हैं और यह विचार कि 'देशी' पूर्णांक प्रारूप है जो तेजी से पुराना है।

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