2010-07-27 9 views
5

संभव डुप्लिकेट:
When to use std::size_t?सी ++, सर्वोत्तम प्रथाओं, int या size_t?

नमस्ते।

मानते हैं कि उपयोग पैटर्न समान हैं (यानी कोई नकारात्मक संख्या नहीं), जो विभिन्न इंडेक्स, int या size_t प्रकार के लिए उपयोग करने के लिए बेहतर है?

क्या दोनों के बीच 64-बिट इंटेल पर आपके अनुभव में प्रदर्शन अंतर है?

धन्यवाद

+0

@Cha धन्यवाद, मैं इस पोस्ट से पहले नहीं मिला। – Anycorn

उत्तर

1

प्रकार भावना आप जिसका अर्थ रहे हैं में अलग नहीं हैं, और आम तौर int 32bits है, और size_t मंच शब्द (32-64 बिट्स) की चौड़ाई है। मैं सुझाव दूंगा कि आप size_t का उपयोग करते समय फ़ाइलों, बफर, और कुछ भी जो स्मृति या बफर के क्षेत्र का वर्णन कर सकते हैं।

इसके अलावा आपको ध्यान रखना चाहिए कि int हस्ताक्षरित है, जबकि size_t नहीं है।

अंत में, int ऐतिहासिक रूप से उपयोग किया गया था जहां size_t अब उपयोग किया जाना चाहिए। हालांकि int अभी भी अन्य उद्देश्यों के लिए अपने अधिकार में उपयोगी है।

+0

धन्यवाद। मैं विशेष रूप से इंटरफेस को बढ़ाने के लिए, लेकिन कंपाइलर चेतावनियों को हटाने के लिए, विशेष रूप से अपने प्रोजेक्ट में मानकीकृत करने की कोशिश कर रहा हूं। – Anycorn

1

size_t या ptrdiff_tint किसी सरणी के सभी तत्वों तक पहुंचने के लिए पर्याप्त नहीं हो सकता है।

+1

@ dan04, यह बेहद असंभव है कि int पर्याप्त नहीं होगा। सबसे महत्वपूर्ण बात यह है कि मानक कंटेनर आकार_टी का उपयोग करते हैं, और चूंकि int_t हस्ताक्षरित होने पर int हस्ताक्षरित है, इसलिए आप हस्ताक्षरित और हस्ताक्षरित प्रकारों के बीच तुलना की स्थितियां प्राप्त कर सकते हैं। –

+0

@ माइकल हारून सफान: काफी विपरीत, 'int' मूल रूप से सामान्य मामले में अपर्याप्त होने की गारंटी है, क्योंकि यह * हस्ताक्षरित * है, यानी यह संकेत के लिए एक बिट बर्बाद करता है। – AnT

+0

@ एंड्रेट, सिद्धांत रूप में, हां, लेकिन व्यावहारिक रूप से, जब आपके पास वास्तव में एक सरणी होती है जो आकार राम में लोड हो जाती है? यदि आपके पास रैम में बहुत अधिक भार है, तो शायद आपके डिज़ाइन में कुछ गड़बड़ है (आपको शायद डेटा स्ट्रीम करना और इटरेटर का उपयोग करना चाहिए), या आपको इस प्रकार के बारे में चिंता करनी चाहिए ... लेकिन लगभग सभी व्यावहारिक स्थितियों के लिए, आप जा रहे हैं बहुत छोटे सरणी से निपटने के लिए। –

5

यह इस बात पर निर्भर करता है कि आप क्या कर रहे हैं। आप एक वेक्टर से अधिक पुनरावृत्ति रहे हैं, तो std :: size_t का उपयोग करें:

for (std::size_t i = 0; i < vec.size(); i++) { 
    // do something with vec[i] 
} 

हालांकि, इस तरह के रूप में त्रुटियों कोडिंग से सावधान:

for (std::size_t i = 99; i >= 0; i--) { 
    // This is an infinite loop 
} 

तुम सिर्फ एक पाश कर रहे हैं, तो आप कर सकते हैं ऊपर की स्थिति की वजह से केवल एक सादा int का उपयोग करें। Int और std :: size_t का उपयोग करने के बीच कोई प्रदर्शन अंतर नहीं होना चाहिए। यदि आपको सटीक आकार की आवश्यकता है, तो आपको न तो int और nor_t का उपयोग करना चाहिए, बल्कि stdint.h में परिभाषित प्रकारों का उपयोग करना चाहिए।

+2

यह आप 'std :: vector <>' (या किसी अन्य मानक कंटेनर) पर फिर से चल रहे हैं, आप शायद 'std :: size_t' पर शॉर्टकटिंग के बजाय' std :: vector <> :: size_type' का उपयोग करना चाहें। – AnT

+0

@AndreyT, अगर कोई सामान्यता के बारे में चिंतित है, तो किसी को वास्तव में इटरेटर का उपयोग करना चाहिए। यदि कोई एक वेक्टर पर फिर से चलने वाले त्वरित कार्य को दबा रहा है, तो std :: size_t के स्थान पर अधिक verbose std :: vector :: size_type से प्राप्त करने के लिए कुछ भी नहीं है। –

+0

मुझे यहां कुछ याद आ रहा है लेकिन फिर दूसरा लूप अनंत क्यों है? –

11

size_t प्रकार है कि सरणी अनुक्रमण के लिए इस्तेमाल किया जाना चाहिए जब आप एक अपेक्षाकृत सामान्य सरणियों के साथ काम करते हैं। अर्थात। जब आपके पास अमूर्त char एस, int एस या कुछ और की एक सरणी है।

आप एक विशिष्ट सरणी के साथ काम कर रहे हैं, यानी एक सरणी है कि कुछ आपके आवेदन के लिए विशिष्ट तत्व शामिल हैं, आप सामान्य रूप से पहले से ही एक "पसंद के प्रकार" में उस प्रकार के संस्थाओं गिनती या सूचकांक के लिए होनी चाहिए अपने आवेदन। यही वह प्रकार है जिसका आप उपयोग करना चाहिए। उदाहरण के लिए, यदि कुछ सरणी में कंपनी के कर्मचारियों के लिए रिकॉर्ड शामिल हैं, तो आपके पास अपने प्रोग्राम में "पसंद का प्रकार" होना चाहिए जिसका उपयोग आप "कर्मचारियों की मात्रा" को निर्दिष्ट करने के लिए करते हैं। यही वह प्रकार है जिसका उपयोग आपको कर्मचारी रिकॉर्ड के सरणी अनुक्रमणित करने के लिए करना चाहिए। यह unsigned int हो सकता है, यह employee_count_t या ऐसा कुछ भी हो सकता है। उस उद्देश्य के लिए नग्न size_t का उपयोग करना एक डिज़ाइन त्रुटि है।

यह भी ध्यान रखें, कि size_t तुरंत सरणी अनुक्रमण के लिए इरादा नहीं एक प्रकार है। यह एक प्रकार है जिसका उद्देश्य कार्यक्रम में सबसे बड़ी वस्तु के आकार का प्रतिनिधित्व करना है। यह पारगमनशीलता द्वारा सरणी के लिए "काम करता है": सरणी वस्तुएं हैं, इसलिए size_t हमेशा एक सरणी को इंडेक्स करने के लिए पर्याप्त है। हालांकि, जब आप एक प्रोग्राम डिजाइन इसे और अधिक समझ में आता है सामान्य कंटेनर के संदर्भ में सोचने के लिए, विशिष्ट सरणियों के संदर्भ में सोचने के बजाय। आज यह एक सरणी हो सकती है, कल आपको इसके बजाय एक लिंक्ड सूची या पेड़ पर स्विच करना पड़ सकता है। सामान्य स्थिति में, size_t की श्रेणी एक अमूर्त कंटेनर में तत्वों की संख्या का प्रतिनिधित्व करने के लिए पर्याप्त नहीं है, इसलिए size_t ऐसे मामलों में एक अच्छा विकल्प नहीं है।

+2

@AndreyT, अगर कल यह एक लिंक्ड सूची या पेड़ हो सकता है, तो किसी भी प्रकार का सूचकांक बिल्कुल अच्छा नहीं है। इसके लिए, आपको इटरेटर की आवश्यकता है। –

+0

@ माइकल हारून सफान: जरूरी नहीं। किसी प्रकार की सेगमेंटेड सरणी बनाना संभव है, जिसके लिए इंडेक्स की अवधारणा अभी भी समझ में आती है, और फिर भी एक सतत मेमोरी ब्लॉक के अधिकतम आकार से सीमित नहीं है। – AnT

+1

@AndreyT, लेकिन लिंक्ड सूचियां यादृच्छिक पहुंच का समर्थन नहीं करती हैं ... यह बहुत हैकिश हो रही है और संभवतः बहुत खराब प्रदर्शन होगा। सबसे सामान्य समाधान इटरेटर या आगंतुकों का उपयोग करना है। सूचकांक केवल यादृच्छिक-पहुंच कंटेनर के लिए समझ में आता है। –

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