2013-03-26 8 views
6

के साथ size_t को बदलने का नकारात्मक पक्ष क्या है जिस लाइब्रेरी पर मैं काम कर रहा हूं, 32 और 64 बिट मशीनों पर उपयोग करने की आवश्यकता है; मेरे पास बहुत से कंपाइलर चेतावनियां हैं क्योंकि 64 बिट मशीनों unsigned int != size_t पर।हस्ताक्षर किए गए लंबे

क्या सभी unsigned int एस और size_t एस को 'हस्ताक्षरित लंबे' द्वारा प्रतिस्थापित करने में कोई नकारात्मक गिरावट है? मैं सराहना करता हूं कि यह बहुत ही सुरुचिपूर्ण नहीं दिखता है, लेकिन, मामले में, स्मृति एक समस्या का बहुत अधिक नहीं है ... मुझे आश्चर्य है कि replace all ऑपरेशन द्वारा बनाई गई किसी भी बग/अवांछित व्यवहार आदि की संभावना है (क्या आप उदाहरण देते हैं)? धन्यवाद।

+0

यदि कुछ समय में पुस्तकालयों के परिवर्तन का विनिर्देशन और 'size_t' हस्ताक्षरित हो जाता है, तो आपको बहुत सारी परेशानी होगी। – Spook

+0

ऐसा होने की संभावना क्या है? size_t को स्मृति पता का प्रतिनिधित्व करना माना जाता है ... –

+4

एक नकारात्मक बात यह है कि 64-बिट विंडोज़ 'size_t' पर' लंबे समय तक हस्ताक्षरित 'है, क्योंकि' लंबा 'केवल 32 बिट्स (64-बिट मोड में भी) है। –

उत्तर

8

क्या चेतावनियां? सबसे स्पष्ट मैं एक "संकुचित रूपांतरण" के बारे में सोच सकता हूं, जिसका कहना है कि आप size_tunsigned int पर असाइन कर रहे हैं, और एक चेतावनी प्राप्त हो रही है कि जानकारी खो जा सकती है।

unsigned long साथ size_t की जगह का मुख्य नकारात्मक पक्ष यह है कि unsigned long इतना बड़ा size_t के हर संभव मान होना चाहिए होने की गारंटी नहीं है, और Windows 64 पर यह इतना बड़ा नहीं है। तो आप पाते हैं कि आपको अभी भी चेतावनियां हैं।

उचित ठीक है कि अगर आप एक चर (या डेटा सदस्य) के लिए एक size_t असाइन करते हैं, क्या आप वाकई चर एक प्रकार इतना बड़ा size_t के किसी भी मान नहीं है बनाना चाहिए है। यही चेतावनी है कि सब कुछ है। इसलिए आपको unsigned long पर स्विच नहीं करना चाहिए, आपको उन चर को size_t पर स्विच करना चाहिए।

इसके विपरीत, यदि आपके पास कोई चर है जो किसी भी आकार को पकड़ने के लिए पर्याप्त होने की आवश्यकता नहीं है, तो unsigned int के लिए पर्याप्त बड़ा है, तो पहले स्थान पर size_t का उपयोग न करें।

दोनों प्रकार के (size_t और unsigned int) वैध उपयोग करता है, इसलिए किसी भी दृष्टिकोण है कि अंधाधुंध कुछ अन्य प्रकार द्वारा उन सभी को उपयोग की जगह होना चाहिए गलत :-) असल में, आप size_t या uintmax_t और के लिए के साथ सब कुछ बदल सकते अधिकांश प्रोग्राम जो ठीक होंगे। अपवाद हैं जहां कोड int के समान आकार के एक हस्ताक्षरित प्रकार का उपयोग करने पर निर्भर करता है, या जो भी हो, जैसे कि बड़ा प्रकार कोड को तोड़ देता है।

4

आप स्थानों में size_t उपयोग कर रहे हैं, जहां आप एक size_t हो और unsigned long से बदलने चाहिए, आप नए चेतावनी का परिचय देंगे।

उदाहरण:

size_t count = some_vector.size(); 

unsigned long के साथ बदलें size_t, और (डिग्री वे अलग हैं करने के लिए) आप एक नया चेतावनी पेश किया है (क्योंकि some_vector.size() रिटर्न एक size_t - वास्तव में एक std:::vector<something>::size_type लेकिन व्यवहार में यह मूल्यांकन करना चाहिए उसी के लिए)।

+0

मुझे और अधिक चेतावनी मिल सकती है, सच है, लेकिन एक वास्तविक समस्या (उदा। बग) प्रेरित करने के लिए upsizing कर सकते हैं? –

+3

@YuccaV किसी भी कार्यक्रम में जो खुद को गंभीरता से लेता है, चेतावनियां वास्तविक समस्या होती हैं। – Angew

+0

यह आपके कोड पर निर्भर करता है। यदि आपके पास है - एक और उदाहरण के लिए - ऑफसेट की गणना की गई अंतर और शून्य से कम होने के लिए उनकी तुलना करें, बिना हस्ताक्षर किए गए आपको नकारात्मक हस्ताक्षर किए जा सकते हैं, जो अधिकतम सीमा के पास कहीं आना चाहिए उस प्रकार के हस्ताक्षरित मूल्य का प्रतिनिधित्व कर सकते हैं (0x11111111 या समान)। यह मूल रूप से आपके कोडबेस पर निर्भर करता है। एंग्यू का बिंदु वैध है हालांकि: आपकी सबसे अच्छी शर्त है कि अपने कंपाइलर को चेतावनियों के लिए शून्य टोलरेंस सेट करें (जीसीसी के लिए '-वियर' विकल्प है)। – utnapistim

4

मानक int और long जैसे आकारों के बारे में बहुत कम गारंटी देता है। size_t किसी ऑब्जेक्ट को पकड़ने के लिए पर्याप्त होने की गारंटी है, और सभी std कंटेनर size_t पर काम करते हैं।

यह एक मंच उदाहरण के लिए छोटे से size_t रूप long परिभाषित करने के लिए, या संकलन विकल्प के लिए long विषय के आकार के लिए, पूरी तरह से संभव है। सुरक्षित होने के लिए, size_t पर चिपकना सर्वोत्तम है।

विचार करने के लिए एक और मानदंड यह है कि size_t का अर्थ है - "यह चीज़ आकार या सूचकांक को स्टोर करने के लिए उपयोग की जाती है।" यह कोड थोड़ा अधिक आत्म-दस्तावेज बनाता है।

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