Cd 20 में std :: ssize () क्यों पेश किया गया है?


99

C ++ 20 ने std::ssize()नीचे दिए गए मुफ्त फ़ंक्शन को प्रस्तुत किया :

template <class C>
    constexpr auto ssize(const C& c)
        -> std::common_type_t<std::ptrdiff_t,
                              std::make_signed_t<decltype(c.size())>>;

एक संभावित कार्यान्वयन का उपयोग कर लगता है static_cast, size()cl गधा सी के सदस्य समारोह के वापसी मूल्य को अपने हस्ताक्षरित समकक्ष में परिवर्तित करने के लिए ।

चूंकि size()C का सदस्य फ़ंक्शन हमेशा गैर-नकारात्मक मान लौटाता है, कोई भी उन्हें हस्ताक्षरित चर में क्यों संग्रहीत करना चाहेगा? यदि कोई वास्तव में चाहता है, तो यह साधारण बात है static_cast

std::ssize()C ++ 20 में क्यों पेश किया गया है?


4
@ Jarod42 अपरिभाषित के बजाय इसे लागू नहीं किया गया है? (हस्ताक्षरित अतिप्रवाह अपरिभाषित है, लेकिन हस्ताक्षर किए रूपांतरण कार्यान्वयन परिभाषित किया गया है।)
Phon

8
यदि केवल वे ssizeofऑपरेटर भी जोड़ते हैं ।
गीजा

3
यह कुछ हद तक संबंधित हो सकता है: stackoverflow.com/questions/30395205/…
मार्को 13

10
@ JohnZ.Li बहुत अचेतन लगने के जोखिम पर: मुझे लगता है कि पूर्णांक प्रकारों के बारे में C ++ का पूरा प्रकार सिस्टम टूट गया है। निश्चित रूप से, कोई यह तर्क दे सकता है कि कुछ quirks (जैसे न जाने कितने बिट्स charहैं) C से विरासत में मिले हैं और कम से कम कुछ हद तक कम हो गए हैं (u)intX_t, लेकिन यह अभी भी समान रूप से सूक्ष्म और महत्वपूर्ण बग का एक अंतहीन स्रोत है । इस तरह की चीजें ssizeकेवल पैच हैं, और इसमें कुछ समय लगेगा (शायद "हमेशा के लिए") जब तक यह आम "सर्वोत्तम प्रथाओं गाइड" में डूब नहीं जाता है कि लोग (सकते हैं) सख्ती से पालन करें।
मार्को 13

6
@ Marco13: दूसरी ओर, C / C ++ प्रकार प्रणाली (जैसे जावा के तय प्रकार प्रणाली के विपरीत), एक तरफ की इजाजत दी C / C ++ आर्किटेक्चर, जहां ज्यादातर अन्य भाषाओं croak पर काम करने के लिए कोड से, करता है की अनुमति देते हैं सक्षम प्रशिक्षकों कुछ महत्वपूर्ण प्राप्त करने के लिए एक छात्र के सिर में सबक। जैसे, सारी दुनिया 64bit नहीं है। और नहीं, सभी दुनिया 8-बिट वर्णों का उपयोग नहीं करती है। यह है आसान मृत इन बातों से निपटने के लिए, और यह आपको एक बेहतर डेवलपर बनाता है, अगर केवल प्रशिक्षकों इस सिखाना होगा शुरू से ही । (और, बस सुनिश्चित करने के लिए, आप है पता है कि (u)intX_tप्रकार के होते हैं वैकल्पिक , है न?)
DevSolar

जवाबों:


69

इस पत्र में औचित्य का वर्णन किया गया है । एक बोली:

जब स्पैन को C ++ 17 में अपनाया गया था, तो यह एक इंडेक्स और साइज दोनों के रूप में एक हस्ताक्षरित पूर्णांक का उपयोग करता था। आंशिक रूप से यह एक प्रकार को इंगित करने के लिए एक प्रहरी मूल्य के रूप में "-1" के उपयोग की अनुमति देने के लिए था जिसका आकार संकलन समय पर ज्ञात नहीं था। लेकिन एक एसटीएल कंटेनर जिसका आकार () फ़ंक्शन एक हस्ताक्षरित मूल्य लौटाया गया था, वह समस्याग्रस्त था, इसलिए P1089 को समस्या को "ठीक" करने के लिए पेश किया गया था। इसे बहुमत का समर्थन मिला, लेकिन आम सहमति के लिए आवश्यक 2-टू -1 मार्जिन नहीं।

यह पत्र, P1227, गैर-सदस्य std :: ssize और सदस्य ssize () फ़ंक्शन जोड़ने का एक प्रस्ताव था। इनको शामिल करने से कुछ कोड और अधिक सरल हो जाएंगे और आकार की गणना में अवांछित अहस्ताक्षरित-नेस से बचने की अनुमति होगी। यह विचार था कि यदि Ssize () सभी कंटेनरों के लिए, std :: ssize () और सदस्य कार्यों के रूप में उपलब्ध कराया जाए तो P1089 के लिए प्रतिरोध कम हो जाएगा।


30
for(int i = 0; i < container.ssize() - 1; ++i)उदाहरण भी काफी सम्मोहक है
Caleth

7
@ मुझे यह वास्तव में लगता है कि वे स्ट्रिंग :: npos के रूप में एक ही काम कर सकते हैं और विशेष मूल्य के रूप में size_t (-1) का उपयोग कर सकते हैं।
रुबेंवब

15
@ JohnZ.Li यह लंबे समय से एक गलती मानी जाती है कि STL आकार प्रकार अहस्ताक्षरित हैं। अब दुर्भाग्य से इसे सुधारने में बहुत देर हो चुकी है। एक मुफ्त कार्य प्रदान करना सबसे अच्छा है जिसे हम अभी तक कर सकते हैं।
एलएफ

16
@ एलएफ: यह एक सम्मेलन में हर्ब सटर था (शायद बज़्ने ने यह भी कहा था)। लेकिन, वह थोड़ा गलत है। अब, 32-बिट / 64-बिट कंप्यूटर के साथ, हस्ताक्षरित आकार बेहतर होगा (इसलिए वह सही है)। लेकिन पुराने दिनों में (16-बिट आकार), हस्ताक्षरित आकार खराब होगा (उदाहरण के लिए, हम केवल 32k बाइट सरणियों को आवंटित कर सकते थे)।
गीजा

11
@ एलएफ: मैंने हर्ब का उल्लेख किया है: youtube.com/watch?v=Puio5dly9N8&t/2667 । जब वह कहता है कि "व्यवहार में नहीं आता है", यह आजकल सच है। लेकिन यह सच नहीं था> 20 साल पहले (16-बिट सिस्टम)। इसलिए, जब एसटीएल डिजाइन किया गया था, तो अहस्ताक्षरित का उपयोग करने के लिए यह एक गलती नहीं थी।
जीजा

50

अनावश्यक रूप से चोरी एरिक Niebler से:

'Unsigned types signal that a negative index/size is not sane'जब एसटीएल पहली बार डिजाइन किया गया था तब प्रचलित ज्ञान था। लेकिन तार्किक रूप से, चीजों की एक गिनती सकारात्मक होने की आवश्यकता नहीं है। मैं किसी संग्रह में जोड़े गए या हटाए गए तत्वों की संख्या को दर्शाने के लिए एक हस्ताक्षरित पूर्णांक में एक गिनती रखना चाह सकता हूं। फिर मैं संग्रह के आकार के साथ संयोजन करना चाहता हूं। यदि संग्रह का आकार अहस्ताक्षरित है, तो अब मुझे हस्ताक्षरित और अहस्ताक्षरित अंकगणित मिश्रण करने के लिए मजबूर किया जाता है, जो एक बग खेत है। कंपाइलर इस बारे में चेतावनी देते हैं, लेकिन क्योंकि एसटीएल का डिज़ाइन प्रोग्रामर को इस स्थिति में ले जाता है, इसलिए चेतावनी इतनी आम है कि ज्यादातर लोग इसे बंद कर देते हैं। यह शर्म की बात है क्योंकि यह असली कीड़े छुपाता है।

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

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


6
स्विफ्ट इस दृष्टिकोण को लेता है, भले ही इसमें नकारात्मक हस्ताक्षरित संख्याओं को बड़े पैमाने पर अहस्ताक्षरित संख्याओं के रूप में फिर से व्याख्या किए जाने के बारे में चिंता न हो (क्योंकि कोई अंतर्निहित जाति नहीं है, जो कि वास्तव में आपको शुरू करने के लिए इस पागल मजेदार घर में मिलता है)। वे बस दृष्टिकोण लेते हैं (मशीन शब्द आकार) Intपूरे नंबर की सामान्य मुद्रा प्रकार होना चाहिए, यहां तक ​​कि जहां केवल सकारात्मक संख्याएं समझ में आती हैं (जैसे कि एक सरणी को अनुक्रमित करना)। इससे कोई भी विचलन अच्छी तरह से स्थापित होना चाहिए। हर जगह जातियों के बारे में चिंता करने की ज़रूरत नहीं है।
अलेक्जेंडर - मोनिका

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.