c++ - Uint8, uint16 आदि का उपयोग




memory-management embedded (6)

वर्तमान में मैं एक 32 बिट MIPS प्लेटफ़ॉर्म के लिए लक्षित कोड बेस (सी, सी + + मिश्रित) के साथ काम कर रहा हूं। प्रोसेसर काफी आधुनिक है [केवल यह उल्लेख करने के लिए कि हमारे पास प्रसंस्करण शक्ति और स्मृति है]

कोड बेस यूआईटी 8 जैसे डेटा प्रकारों का उपयोग करता है [1 बाइट चौड़ा अहस्ताक्षरित पूर्णांक], यूआईटी 16 [2 बाइट विस्तृत अहस्ताक्षरित पूर्णांक], यूआईटी 32 [4 बाइट चौड़ा अहस्ताक्षरित पूर्णांक] आदि।

मुझे पता है कि कोड के विभिन्न प्लेटफार्मों को पोर्ट करते समय इन संरचनाओं के उपयोग को कैसे मदद मिलती है।

मेरे प्रश्न हैं:

  1. यूआईटी 16 का प्रयोग करते हुए / लाभ का उपयोग क्या है जहां यूआईटी 32 भी पर्याप्त होगा (यदि कोई है)?

  2. क्या छोटे डेटा प्रकारों (डेटा संरेखण के आधार पर) का उपयोग करने में स्मृति उपयोग में कोई बचत होगी?

  3. अगर यह स्मृति के कुछ बाइट्स को सहेजना है, तो क्या यह आधुनिक हार्डवेयर में कुछ समझदार है?


यूआईटी 16 का प्रयोग करते हुए / लाभ का उपयोग क्या है जहां यूआईटी 32 भी पर्याप्त होगा (यदि कोई है)?

ऐसे CPU्स हैं जहां unsigned char 16-बिट मान हैं यूनिट टेस्टिंग इस तरह के कोड टाइपिंग के उपयोग के बिना मुश्किल हो जाएगा (यूआईटी 16 केवल उचित प्रकार के लिए एक टाइप किया गया है)।

इसके अलावा, इन टाइपिंग के उपयोग के साथ, कई समस्याओं के बिना विभिन्न प्लेटफार्मों पर निर्माण करना आसान है।

क्या छोटे डेटा प्रकारों (डेटा संरेखण के आधार पर) का उपयोग करने में स्मृति उपयोग में कोई बचत होगी?

नहीं, यह एक बिंदु नहीं है यदि uint16 एक unsigned short लिए टाइप किया गया है, तो आप हर जगह unsigned short उपयोग कर सकते हैं, लेकिन आप अलग-अलग प्लेटफार्मों पर विभिन्न प्रकार प्राप्त कर सकते हैं।

बेशक, एक प्रकार का छोटा उपयोग स्मृति की खपत को कम करेगा उदाहरण के लिए, uint32 के बजाय uint16 का उपयोग करना, लेकिन केवल अगर आप एरेज़ का उपयोग करते हैं

अगर यह स्मृति के कुछ बाइट्स को सहेजना है, तो क्या यह आधुनिक हार्डवेयर में कुछ समझदार है?

यह मंच पर निर्भर करता है:

  • कम मेमोरी उपयोग कम कैश याद करते हैं
  • यदि समर्थित है, तो SIMD फ़ंक्शन हैं जो 16-बिट डेटा प्रोसेस करते हैं

यूआईटी 16 का प्रयोग करते हुए / लाभ का उपयोग क्या है जहां यूआईटी 32 भी पर्याप्त होगा (यदि कोई है)?

यदि उन uint16s arrays या structures के कुछ हिस्सों हैं, तो आप स्मृति को बचा सकते हैं और शायद उन arrays या संरचनाओं में uint32s साथ बड़ा डेटा सेट को संभालने में सक्षम हो सकते हैं यह वास्तव में आपके कोड पर निर्भर करता है।

डेटा प्रोटोकॉल और फ़ाइल प्रारूप uint16s उपयोग कर सकते हैं और इसके बजाय uint32s का उपयोग करने के लिए सही नहीं हो सकता है। यह प्रारूप और शब्दार्थों पर निर्भर करता है (उदाहरण के लिए अगर आपको 65535 से 0 तक चारों ओर लपेट करने के लिए मान की आवश्यकता होती है, तो uint16 स्वचालित रूप से ऐसा करेंगे, जबकि uint32 नहीं होगा)।

uint16s , अगर उन uint16s केवल एक स्थानीय या ग्लोबल वैरिएबल हैं, तो इन्हें 32-बिट वाले के साथ बदलकर कोई महत्त्वपूर्ण अंतर नहीं हो सकता है क्योंकि वे संरेखण के कारण एक ही स्थान पर कब्जा कर सकते हैं और उन्हें 32-बिट पैरामीटर (स्टैक पर या रजिस्टरों में) वैसे भी एमआईपी पर।

क्या छोटे डेटा प्रकारों (डेटा संरेखण के आधार पर) का उपयोग करने में स्मृति उपयोग में कोई बचत होगी?

बचत हो सकती है, खासकर जब uint16s कई संरचनाओं या बड़े arrays के तत्वों के हिस्से हैं।

अगर यह स्मृति के कुछ बाइट्स को सहेजना है, तो क्या यह आधुनिक हार्डवेयर में कुछ समझदार है?

हां, आप मेमोरी बैंडविड्थ को कम करते हैं (जो हमेशा एक अच्छी बात है) और जब आप कम डेटा पर काम करते हैं तो आप अक्सर कई कैश मेसेज (डेटा कैश और टीएलबी) कम करते हैं


उत्तर:। 1. सॉफ़्टवेयर में कुछ आवश्यकताएं और विनिर्देश हैं जो एन्कोडिंग / डिकोडिंग या कुछ अन्य विशिष्ट उपयोग करते समय कड़ाई से केवल पैरामीटर के 8/16-बिट लेते हैं। तो, भले ही यू 0 9 से यूआई 8 में बड़ा मान असाइन करें, तो यह आपके लिए स्वचालित रूप से डाटा ट्रिम करता है।

उत्तर:। 2. हमें यह नहीं भूलना चाहिए कि अनुकूलन करने के लिए हमारे कंपाइलर बुद्धिमान से परे हैं, यह स्मृति या जटिलता होना चाहिए। इसलिए संभव है कि हमेशा संभव होने पर एक छोटी स्मृति का उपयोग करें।

उत्तर:। 3. बेशक बचत स्मृति आधुनिक एच / डब्ल्यू पर समझ में आता है


कोड की कोई भी बचत करने के लिए किसी को उत्पादित मशीन कोड / कोडल को जांचना होगा। आरआईएससी प्रकार के आर्किटेक्चर में विशिष्ट तात्कालिक 16-बिट है, लेकिन यूआईटी 16_टी का उपयोग करने से एक पूर्ण 32-बिट रजिस्टर का उपयोग होगा - इस प्रकार, यदि इंट प्रकार का उपयोग करना है, लेकिन शून्य के पास मानों का उपयोग करने के लिए समान परिणामों का उत्पादन होगा और अधिक पोर्टेबल होगा

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

ps। कम्पाइलर स्मार्ट होते हैं, लेकिन उन्हें लिखने वाले लोग इस समय काम करते हैं कि उन्हें भी बेहतर बनाते हैं।


सबसे पहले अगर आपके पास ऐसे प्रकार जैसे यूआईटी 16 परिभाषित किए गए हैं, जहां उन्हें परिभाषित किया गया है? वे मानक प्रकार नहीं हैं, इसलिए कुछ स्वामित्व शीर्षक में परिभाषित किया जाएगा - शायद आपका हो या कुछ तृतीय पक्ष पुस्तकालय द्वारा प्रदान किया जा सकता है; इस मामले में आपको खुद से यह पूछना पड़ेगा कि यह कोड कितना पोर्टेबल है, और क्या आप उस निर्भरता का निर्माण कर रहे हैं जो कुछ अन्य अनुप्रयोगों में समझ नहीं पा रहे हैं।

एक अन्य समस्या यह है कि कई पुस्तकालयों (आईएमओ) ऐसे प्रकारों को यूआईएनटी 16, यूआईटी 16, यू 16 यूआई 16 आदि जैसे विभिन्न नामों के साथ परिभाषित करते हैं। यह कुछ प्रकार के एक दुःस्वप्न बन जाता है जो प्रकार समझौते को सुनिश्चित करता है और नाम संघर्ष से बचता है। यदि ऐसे नामों को परिभाषित किया जाता है, तो उन्हें आदर्श रूप से एक नेमस्पेस में रखा जाना चाहिए या किसी लायब्रेरी के विशिष्ट उपसर्ग को इंगित करने के लिए कि वह किस पुस्तकालय के साथ उपयोग के लिए परिभाषित किया गया था, उदाहरण के लिए, rtos::uint16 to rtos_uint16

चूंकि ISO C99 मानक लाइब्रेरी मानक बिट-लंबाई विशिष्ट प्रकार stdint.h में प्रदान करता है, इसलिए आपको मालिकाना या तृतीय-पक्ष शीर्षलेख में किसी भी परिभाषित पर उनका उपयोग करना चाहिए। इन प्रकारों में एक _t प्रत्यय है, जैसे uint16_t सी ++ में उन्हें std:: namespace में रखा जा सकता है (यद्यपि हेडर C99 में पेश किए जाने के बाद से नहीं दिया गया है)।

1] यूआईटी 16 का उपयोग करने में / लाभ का क्या फायदा है, जहां यूआईटी 32 भी पर्याप्त होगा (यदि कोई है)?

मेरी पिछली सलाह के अलावा stdint.h के uint16_t को पसंद करने के लिए, लंबाई विशिष्ट प्रकारों का उपयोग करने के कम से कम दो वैध कारण हैं:

  1. एक विशिष्ट हार्डवेयर रजिस्टर चौड़ाई से मेल करने के लिए
  2. विभिन्न आर्किटेक्चर में एक आम और संगत API को लागू करने के लिए।

2] स्मृति डेटा प्रकारों (डेटा संरेखण के आधार पर) के उपयोग में स्मृति उपयोग में कोई बचत होगी?

शायद, लेकिन अगर आपकी समस्या स्मृति नहीं है, तो इसका इस्तेमाल करने का कोई अच्छा कारण नहीं है। संभवतः बड़े डेटा ऑब्जेक्ट्स या एरे के लिए विचार करने में योग्य है, लेकिन विश्व स्तर पर लागू करने का प्रयास शायद ही कभी कम है।

3] अगर यह स्मृति के कुछ बाइट्स को सहेजना है, तो क्या यह आधुनिक हार्डवेयर में कुछ समझदार है?

देखें [2] " आधुनिक हार्डवेयर " हालांकि जरूरी बड़े संसाधनों का मतलब नहीं है; उदाहरण के लिए राम के केवल कुछ केबी के साथ 32 बिट एआरएम कॉर्टेक्स एम डिवाइस हैं। यह डिजाइन, आर्किटेक्चर की आयु के मुकाबले अंतरिक्ष, लागत और बिजली की खपत के बारे में अधिक है।


cstdint में विभिन्न प्रयोजनों के लिए typedef cstdint का भार है

  • एक विशिष्ट चौड़ाई के लिए intN_t
  • सबसे तेज पूर्णांक के लिए int_fastN_t , जिसमें कम से कम एन बिट्स हैं
  • सबसे छोटी पूर्णांक के लिए int_leastN_t , जिसमें कम से कम एन बिट्स हैं
  • उनके unsigned समकक्ष

आपको अपनी परिस्थितियों के आधार पर चुनना चाहिए एक std::vector में हजारों संग्रह और गणना के भार नहीं कर रहा है? intN_t शायद आपका आदमी है पूर्णांक संख्या की एक छोटी संख्या पर तीव्रता की आवश्यकता है? int_fastN_t शायद आपका आदमी है





embedded