2012-02-11 11 views
37

मैंने हाल ही में मानक सबसे तेज़ प्रकार, मुख्य रूप से int_fast32_t और int_fast64_t के अस्तित्व की खोज की है।intXX_t और int_fastXX_t के बीच क्या अंतर है?

मैं हमेशा बताया गया था कि, मुख्यधारा वास्तुकला पर सामान्य उपयोग के लिए, एक बेहतर इस्तेमाल करना चाहिए शास्त्रीय पूर्णांक & लंबे जो हमेशा प्रोसेसर डिफ़ॉल्ट पठन क्षमता के अनुरूप होनी चाहिए और इतने बेकार सांख्यिक रूपांतरण से बचें।

"typedef नाम int_fastN_t कम से कम एन की चौड़ाई typedef नाम uint_fastN_t सबसे तेजी से निर्दिष्ट के साथ सबसे तेजी से हस्ताक्षर किए पूर्णांक प्रकार निर्दिष्ट करता:

C99 स्टैंडर्ड में, यह §7.18.1.3p2 में कहते हैं कम से कम एन की चौड़ाई के साथ हस्ताक्षरित पूर्णांक प्रकार। "

और वहाँ भी §7.18.1.3p1 में इसके बारे में एक उद्धरण है:

"नामित प्रकार सभी प्रयोजनों के लिए सबसे तेजी से होने की गारंटी नहीं है, कार्यान्वयन को चुनने के लिए कोई स्पष्ट आधार है अगर एक प्रकार से अधिक एक प्रकार, यह केवल कुछ पूर्णांक प्रकार को हस्ताक्षर और चौड़ाई आवश्यकताओं को पूरा करेगा। "

यह क्या सबसे तेजी से वास्तव में इसका मतलब है मेरे लिए स्पष्ट नहीं है। मुझे समझ में नहीं आता कि मुझे इस प्रकार का उपयोग कब करना चाहिए और जब मुझे नहीं करना चाहिए।

मैं इस पर एक छोटे से googled और पाया कि कुछ opensourceprojects इसे करने के लिए उनके कार्यों के कुछ बदल दिया है, लेकिन उन सभी को नहीं किया है। उन्होंने वास्तव में यह नहीं बताया कि उन्होंने एक हिस्सा क्यों बदल दिया है, और केवल उनके कोड का एक हिस्सा है।

क्या आप जानते हैं कि विशिष्ट मामलों/उपयोग क्या हैं जब int_fastXX_t वास्तव में शास्त्रीय लोगों की तुलना में तेज हैं?

+1

+1। मैं काफी समय से इस बारे में सोच रहा हूं, और [सी तर्क] (http://www.open-std.org/jtc1/sc22/wg14/www/C99RationaleV5.10.pdf) विषय पर शांत है । –

उत्तर

19

सी 99 मानक में, 7.18.1.3 सबसे तेज़ न्यूनतम-चौड़ाई पूर्णांक प्रकार।

(7.18.1.3p1) "निम्नलिखित प्रकार से प्रत्येक एक पूर्णांक प्रकार आम तौर पर fastest225 है कि) सभी पूर्णांक प्रकार है कि कम से कम निर्दिष्ट चौड़ाई के बीच के साथ संचालित करने के लिए निर्दिष्ट करता है।"

225) "नामित प्रकार को सभी उद्देश्यों के लिए सबसे तेज़ होने की गारंटी नहीं है; यदि कार्यान्वयन के पास एक प्रकार का चयन करने के लिए कोई स्पष्ट आधार नहीं है, तो यह केवल कुछ पूर्णांक प्रकार को हस्ताक्षर और चौड़ाई आवश्यकताओं को पूरा करेगा।"

और

(7.18.1.3p2) "typedef नाम int_fastN_t कम से कम एन की चौड़ाई के साथ सबसे तेजी से हस्ताक्षर किए पूर्णांक प्रकार typedef नाम uint_fastN_t साथ सबसे तेजी से अहस्ताक्षरित पूर्णांक प्रकार निर्दिष्ट करता है जिनकी नियुक्त कम से कम एन की चौड़ाई"

प्रकार int_fastN_t और uint_fastN_t सटीक-चौड़ाई पूर्णांक प्रकार intN_t और uintN_t को समकक्षों कर रहे हैं। कार्यान्वयन गारंटी देता है कि वे कम से कम N बिट्स ले, लेकिन कार्यान्वयन अधिक बिट्स ले अगर यह बड़ा का उपयोग कर अनुकूलन प्रदर्शन कर सकते हैं कर सकते हैं प्रकार;। यह सिर्फ वे कम से कम N बिट्स लेने की गारंटी देता है

उदाहरण के लिए, एक 32-बिट मशीन पर, uint_fast16_t एक unsigned int के रूप में परिभाषित किया जा सकता है बजाय एक unsigned short क्योंकि मशीन शब्द आकार के प्रकार के साथ काम करने और अधिक कुशल हो जाएगा के रूप में

उनके अस्तित्व का एक अन्य कारण सटीक-चौड़ाई पूर्णांक प्रकार सी में वैकल्पिक है लेकिन सबसे तेज़ न्यूनतम-चौड़ाई पूर्णांक प्रकार और न्यूनतम-चौड़ाई पूर्णांक प्रकार (int_leastN_t और uint_leastN_t) आवश्यक हैं।

+1

यह ज्यादा समझा नहीं है।"32-बिट मशीन पर, 'uint_fast16_t' को' हस्ताक्षरित int 'के रूप में परिभाषित किया जा सकता है - हां, लेकिन आप सीधे पुराने' हस्ताक्षरित int 'का उपयोग कर सकते हैं, क्योंकि यह मूल पूर्णांक चौड़ाई है और मानक गारंटी यह है कम से कम 16 बिट चौड़ा। इसी प्रकार, 'long'' int_fast32_t' के समान बाधाओं के बारे में मिलता है। –

+0

मैंने तर्क पढ़ा है, लेकिन यह नहीं कहता है कि यह किस प्रकार का विशिष्ट उपयोग है? यदि यह हर बार _really_ तेज है, तो हम डिफ़ॉल्ट रूप से उनका उपयोग क्यों नहीं करते? – Coren

+2

@larsmans 'uint_fast16_t' 32-बिट मशीन में 'हस्ताक्षरित int' के लिए और 64-बिट मशीन में 'हस्ताक्षरित लंबे' के लिए उपनाम हो सकता है। अपने प्रोग्राम में 'uint_fast16_t' के बजाय' हस्ताक्षरित int' का उपयोग करना समान नहीं होगा यदि आप अलग-अलग मशीनों में अपने प्रोग्राम को संकलित करना चाहते हैं। – ouah

2

शायद विदेशी हार्डवेयर को छोड़कर कोई अंतर नहीं होगा जहां int32_t और int16_t भी मौजूद नहीं है।

उस स्थिति में आप 16 बिट्स वाले छोटे प्रकार के प्राप्त करने के लिए int_least16_t का उपयोग कर सकते हैं। यदि आप अंतरिक्ष को संरक्षित करना चाहते हैं तो महत्वपूर्ण हो सकता है।

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

सबसे आम मशीनों पर ये 16-बिट प्रकार short के लिए टाइप किए गए होंगे, और आपको परेशान करने की आवश्यकता नहीं है।

2

जीएनयू libc defines {int, uint} _fast {16,32} _ 64-बिट CPUs और 32-बिट के लिए संकलित करते समय 64-बिट के रूप में। 64-बिट पूर्णांक पर संचालन इंटेल और एएमडी 64-बिट x86 CPUs पर 32-बिट पूर्णांक पर समान संचालन की तुलना में तेज़ होते हैं।

+0

हां, लेकिन ऐसी मशीन पर 'int' 64-बिट नहीं होना चाहिए? – potrzebie

+0

नहीं, 'int' 16 बिट्स जितना छोटा हो सकता है, और इसका आकार आमतौर पर संकलक पर निर्भर करता है लेकिन मंच पर नहीं। यह शायद 16 से 32-बिट संक्रमण का एक आर्टिफैक्ट है। – user833771

+0

"जटिल" के लिए आपका लिंक कुछ जटिल कार्य को कम करने के लिए 32-बिट और 64-बिट CPU मोड की तुलना कर रहा है, यह उसी CPU मोड के तहत 32-बिट और 64-बिट पूर्णांक के प्रदर्शन की तुलना नहीं कर रहा है। – plugwash

1

आईएमओ वे बहुत व्यर्थ हैं।

कंपाइलर उस परवाह नहीं करता है जिसे आप एक प्रकार कहते हैं, केवल इसका आकार क्या है और इसके लिए कौन से नियम लागू होते हैं। तो यदि int, in32_t और int_fast32_t आपके प्लेटफ़ॉर्म पर सभी 32-बिट हैं तो वे लगभग निश्चित रूप से सभी एक ही प्रदर्शन करेंगे।

सिद्धांत यह है कि भाषा के कार्यान्वयनकर्ताओं को अपने हार्डवेयर पर सबसे तेज़ होने के आधार पर चुना जाना चाहिए, लेकिन मानक लेखकों ने कभी भी सबसे तेज़ परिभाषा को स्पष्ट नहीं किया। इस तथ्य को जोड़ें कि प्लेटफॉर्म रखरखाव ऐसे प्रकार की परिभाषा को बदलने में अनिच्छुक हैं (क्योंकि यह एबीआई ब्रेक होगा) और प्लेटफॉर्म जीवन की शुरूआत में परिभाषाओं को मनमाने ढंग से उठाया जाता है (या सी प्लेटफ़ोन के अन्य प्लेटफार्मों से विरासत में लिया गया था से पोर्ट किया गया) और फिर कभी छुआ नहीं।

आप सूक्ष्म अनुकूलन आपको लगता है कि चर आकार पर अपने प्रोसेसर एक महत्वपूर्ण अंतर तो बेंचमार्क अपने कोड के साथ विभिन्न विकल्पों कर सकते हैं के स्तर पर कर रहे हैं। अन्यथा इसके बारे में चिंता मत करो। "तेज़" प्रकार कुछ भी उपयोगी आईएमओ नहीं जोड़ते हैं।

संबंधित मुद्दे