2016-03-22 2 views
12

सी ++ में हमेंऔर std::int64_t जैसे फिक्स्ड-चौड़ाई पूर्णांक प्रकार प्रदान किए जाते हैं, जो वैकल्पिक हैं और इसलिए क्रॉस-प्लेटफ़ॉर्म कोड लिखने के लिए इष्टतम नहीं हैं। हालांकि, हमें प्रकारों के लिए गैर-वैकल्पिक रूप भी मिलते हैं: उदा। "तेज़" प्रकार, उदा। std::int_fast32_t और std::int_fast64_t, साथ ही साथ "सबसे छोटे आकार" संस्करण, उदा। std::int_least32_t, जो दोनों आकार में कम से कम बिट्स निर्दिष्ट हैं।क्या क्रॉस-प्लेटफ़ॉर्म कोड में int से C++ 11 के std :: int_fast32_t या std :: int_fast16_t का उपयोग करने का कोई कारण है?

जिस कोड पर मैं काम कर रहा हूं वह एक सी ++ 11-आधारित क्रॉस-प्लेटफ़ॉर्म लाइब्रेरी का हिस्सा है, जो सबसे लोकप्रिय यूनिक्स/विंडोज/मैक कंपाइलर्स पर संकलन का समर्थन करता है। एक प्रश्न जो अब आया है, यदि सी ++ 11 निश्चित-चौड़ाई पूर्णांक प्रकारों द्वारा कोड में मौजूदा पूर्णांक प्रकारों को बदलने में कोई फायदा होता है।

std::int16_t और std::int32_t तरह वैरिएबल का उपयोग का एक नुकसान यह है कि वे उपलब्ध हैं, क्योंकि वे केवल कार्यान्वयन सीधे प्रकार (http://en.cppreference.com/w/cpp/types/integer के अनुसार) का समर्थन करता है प्रदान की जाती हैं एक गारंटी की कमी है।

हालांकि, int से कम से कम 16 बिट्स और 16-बिट कोड में उपयोग किए गए पूर्णांक के लिए पर्याप्त हैं, int पर std::int_fast16_t के उपयोग के बारे में क्या? क्या यह int प्रकारों को std::int_fast16_t और सभी unsigned int के std::uint_fast16_t द्वारा इस तरह से अवांछित करने का लाभ प्रदान करता है या यह अनावश्यक है?

Anologously, अगर जानते हुए भी कि सभी समर्थित प्लेटफार्मों और compilers में कम से कम 32 बिट आकार की एक int की सुविधा है, यह भावना std::int_fast32_t और std::uint_fast32_t क्रमशः द्वारा उन्हें बदलने के लिए है?

+4

आपका "नुकसान" एक धारणा पर आधारित प्रतीत होता है। कौन कहता है कि 'std :: int16_t' और 'std :: int32_t' दूर जा सकता है? आखिरकार, उन्हें * मानक * की आवश्यकता होती है। –

+3

यदि आप यह सुनिश्चित करना चाहते हैं कि आपकी int कम से कम 32 बिट चौड़ी है, तो इसे करें। सामान्य 'int' ऐसी गारंटी नहीं देता है। –

+3

@ ग्रेगहेविल वे वैकल्पिक हैं। मेरा मतलब था कि उन्हें ओएस और कंपाइलर के भविष्य के संस्करणों में समर्थित नहीं किया जा सकता है, अगर उन्हें वहां पहले समर्थित किया गया था। मुझे किसी भी ओएस और कंपाइलर से अवगत नहीं है जो std :: int16_t और std :: int32_t प्रदान नहीं करता है, लेकिन चूंकि वे केवल इस गैर-वैकल्पिक हैं यदि इस आकार का पूर्णांक पहले से मौजूद है, तो उनके अस्तित्व की गारंटी नहीं दी जा सकती है। यह भी देखें: http: // stackoverflow।com/प्रश्न/32155759/वैकल्पिक-निश्चित-चौड़ाई-पूर्णांक-प्रकार-पेश-इन-सी 11 जहां आप अधिक जानते हैं तो उत्तर दे सकते हैं :) – Ident

उत्तर

20

int वर्तमान कंप्यूटर और कंपाइलर्स पर 16, 32 या 64 बिट भी हो सकता है। भविष्य में, यह बड़ा हो सकता है (कहें, 128 बिट्स)।

यदि आपका कोड ठीक है, तो इसके साथ चलें।

यदि आपका कोड केवल 32 बिट इंट्स के साथ परीक्षण और काम कर रहा है, तो int32_t का उपयोग करने पर विचार करें। तब कोड उस समय चलने के बजाए संकलित समय पर संकलित समय में असफल हो जाएगा, जिसमें 32 बिट इन्ट्स नहीं है (जो आज बेहद दुर्लभ है)।

int_fast32_t तब होता है जब आपको कम से कम 32 बिट्स की आवश्यकता होती है, लेकिन आप प्रदर्शन के बारे में बहुत अधिक परवाह करते हैं। हार्डवेयर पर 32 बिट पूर्णांक को 64 बिट पूर्णांक के रूप में लोड किया जाता है, फिर एक बोझिल प्रक्रिया में 32 बिट पूर्णांक तक बिट्सफ़िफ्ट किया जाता है, int_fast_32_t 64 बिट पूर्णांक हो सकता है। इसकी लागत यह है कि अस्पष्ट प्लेटफॉर्म पर, आपका कोड बहुत अलग व्यवहार करता है।

यदि आप ऐसे प्लेटफ़ॉर्म पर परीक्षण नहीं कर रहे हैं, तो मैं इसके खिलाफ सलाह दूंगा।

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

रूढ़िवादी बनें, हार्डवेयर पर शुरुआती त्रुटियां उत्पन्न करें जिन पर आप परीक्षण नहीं किए जाते हैं, और जब आपको हार्डवेयर को पोर्ट करने की आवश्यकता होती है तो काम और परीक्षण विश्वसनीय होने की आवश्यकता होती है।

संक्षेप में:

उपयोग int_fast##_t यदि और केवल यदि आप अपने कोड का परीक्षण किया है (और यह परीक्षण करने के लिए जारी रहेगा) प्लेटफॉर्म जहां पूर्णांक आकार बदलता रहता है पर, और आप पता चला है कि प्रदर्शन में सुधार के लायक है भविष्य में रखरखाव।

int##_t का उपयोग ## आकारों के साथ करना है इसका मतलब है कि आपका कोड उन प्लेटफॉर्म पर संकलित करने में विफल रहेगा जिन पर आपने इसका परीक्षण नहीं किया है। यह अच्छा है; अवांछित कोड विश्वसनीय नहीं है, और अविश्वसनीय कोड बेकार से भी बदतर है।

int32_t उपयोग कर, और int का उपयोग कर के बिना, आपके कोड कभी कभी int कि 32 और कभी कभी ints कि 64 (और सिद्धांत में अधिक), और कभी कभी int कि 16 कर रहे हैं आप परीक्षण करने के लिए तैयार हैं और यदि कर रहे हैं होगा इस तरह के हर int में इस तरह के हर मामले का समर्थन करें, इसके लिए जाएं।

ध्यान दें कि int_fast##_t के सरणी में कैश की समस्या हो सकती है: वे अनुचित रूप से बड़े हो सकते हैं। उदाहरण के तौर पर, int_fast16_t 64 बिट्स हो सकता है। उनमें से कुछ हज़ार या दस लाख लोगों के साथ काम करने के लिए व्यक्तिगत रूप से तेज़ हो सकता है, लेकिन उनके थोक के कारण कैश की यादें उन्हें धीमी गति से बना सकती हैं; और जोखिम जो धीमे भंडारण के लिए बाहर निकलता है वह बढ़ता है।

int_least##_t उन मामलों में तेज़ी से हो सकता है।

उसी मुद्दे पर, नेटवर्क-ट्रांसमिटेड और फ़ाइल से संग्रहीत डेटा के लिए, दोगुनी रूप से लागू होता है, स्पष्ट रूप से नेटवर्क/फ़ाइल डेटा को संकलक/हार्डवेयर परिवर्तनों पर स्थिर प्रारूपों का पालन करना पड़ता है। हालांकि, यह एक अलग सवाल है।

हालांकि, निश्चित चौड़ाई पूर्णांक प्रकारों का उपयोग करते समय आपको इस तथ्य पर विशेष ध्यान देना होगा कि int, long, आदि अभी भी पहले की समान चौड़ाई है। इंटीजर पदोन्नति अभी भी int के आकार के आधार पर होती है, जो आपके द्वारा उपयोग किए जा रहे कंपाइलर पर निर्भर करती है। आपके कोड में एक अभिन्न संख्या संबंधित चौड़ाई के साथ टाइप int int होगी। यदि आप एक अलग कंपाइलर का उपयोग करके अपना कोड संकलित करते हैं तो इससे अवांछित व्यवहार हो सकता है। अधिक विस्तृत जानकारी के लिए: https://stackoverflow.com/a/13424208/3144964

+0

सबसे पहले, त्वरित और सहायक उत्तर के लिए धन्यवाद! दुर्भाग्यवश आपने इस उत्तर को इतनी तेज़ी से लिखा था कि मैं अभी भी एक गलती को ठीक कर रहा था जिसे मैंने अपने प्रश्न में बनाया था (माना जाता है कि समर्थित सिस्टम में स्याही कम से कम 32 बिट हैं) और अब सवाल थोड़ा बढ़ाया गया है। उसके लिए खेद है। – Ident

+0

@ident I ने एक अनुच्छेद या दो जोड़ा। – Yakk

+1

आपको 'int_leastxx * 'और' int_fast' के लिए उपयोग के मामलों को इंगित करना चाहिए। यदि आपको ऐसे पूर्णांक स्टोर करना है तो सबसे तेज़ नहीं हो सकता है, कुछ भी आकार (int_fast32_t) को अनुचित रूप से बड़ा होने से रोकता है, जो कैश के कारण वास्तव में इसे 'int_least32_t' से धीमा कर सकता है। – sbabbi

1

मुझे अभी एहसास हुआ है कि ओपी सिर्फ int_fast##_tint##_t नहीं पूछ रहा है क्योंकि बाद में वैकल्पिक है। हालांकि, मैं जवाब को रोकता हूं यह किसी की मदद कर सकता है।


मैं कुछ जोड़ूंगा। अन्य भाषाओं के लिए एपीआई बनाने के लिए निश्चित आकार पूर्णांक बहुत महत्वपूर्ण (या यहां तक ​​कि एक जरूरी) हैं। एक उदाहरण यह है कि जब आप pInvoke फ़ंक्शंस करना चाहते हैं और उदाहरण के लिए .NET प्रबंधित कोड से मूल C++ DLL में उन्हें डेटा पास करते हैं। .NET में, int एक निश्चित आकार होने की गारंटी है (मुझे लगता है कि यह 32 बिट है)। इसलिए, यदि आपने सी ++ में int का उपयोग किया था और इसे 32 बिट के बजाय 64-बिट के रूप में माना जाता था, तो इससे समस्याएं हो सकती हैं और लिपटे structs के अनुक्रम में कटौती हो सकती है।

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