दिलचस्प पोस्ट
सी ++ 11 लैम्ब्डा में संदर्भ द्वारा एक संदर्भ कैप्चर करना एंड्रॉइड टुकड़े और एनीमेशन बिटमैप पर स्पर्श का पता लगाएं अनसाइन्ड इन्टर का बह निकला एक आरएस 232 सीरियल पोर्ट बनाते हुए जावा के लिए सर्वश्रेष्ठ वेब अनुप्रयोग फ्रेमवर्क? आरंभीकरण सूची (सी ++) के साथ माता-पिता के संरक्षित सदस्यों को आरंभ करना अपरिभाषित "कुल मूल्य" संपत्ति को पढ़ नहीं सकते सैंड्राइवल / डब्ल्यूपी 7 में डाटाबाउंडिंग टेक्स्टब्लॉक चलाता है यूआरएल एनकोड और एचटीएमएल एन्कोड के बीच का अंतर टंकिनर जीयूआई के लिए कमांड लाइन परिणाम पुनर्निदेशित करें छोरों के साथ प्रक्षेपक का उपयोग करना JComboBox स्वत: पूर्ण विंडोज इंस्टालर और वाईएक्स के निर्माण एक सी पॉइंटर वास्तव में क्या नहीं है, तो मेमोरी एड्रेस क्या है?

डिफ़ॉल्ट रूप से पूर्णांक अतिप्रवाह पर भाषाएं क्यों नहीं बढ़ाती हैं?

कई आधुनिक प्रोग्रामिंग भाषाओं (सी ++, जावा, और सी # सहित) में, भाषा किसी भी प्रकार की त्रुटि स्थिति को बिना बिना पूर्णतया अतिप्रवाह चलाने की अनुमति देती है।

उदाहरण के लिए, इस (कॉन्ट्रैवरेड) सी # विधि पर विचार करें, जो ओवरफ्लो / अंडरफ्लो की संभावना के लिए खाता नहीं है (संक्षेप के लिए, यह विधि भी उस स्थिति को नियंत्रित नहीं करती है जहां निर्दिष्ट सूची एक रिक्त संदर्भ है।)

//Returns the sum of the values in the specified list. private static int sumList(List<int> list) { int sum = 0; foreach (int listItem in list) { sum += listItem; } return sum; } 

यदि इस विधि को निम्नानुसार कहा जाता है:

 List<int> list = new List<int>(); list.Add(2000000000); list.Add(2000000000); int sum = sumList(list); 

sumList() विधि में एक अतिप्रवाह हो जाएगा (क्योंकि सी # में int प्रकार एक 32-बिट हस्ताक्षरित पूर्णांक है, और सूची में मानों का योग अधिकतम 32-बिट हस्ताक्षरित पूर्णांक के मान से अधिक है)। योग की वैरिएबल का मूल्य होगा- 2 9 4 9 672 9 6 (4000000000 का मान नहीं); यह सबसे अधिक संभावना नहीं है कि क्या (काल्पनिक) डेवलपर के sumList विधि का इरादा है

जाहिर है, वहाँ विभिन्न तकनीकों है कि डेवलपर्स द्वारा पूर्णांक ओवरफ्लो की संभावना से बचने के लिए उपयोग किया जा सकता है, जैसे कि जावा की BigInteger , या checked खोजशब्द और /checked कम्पाइलर स्विच को सी # में उपयोग करना।

हालांकि, जो प्रश्न मुझे रूचि में है, वह यह है कि इन भाषाओं को डिफॉल्ट रूप से डिज़ाइन किया गया था क्योंकि प्राथमिक रूप से पूर्णांक ओवरफ्लो को पहली जगह में होने की अनुमति दी जाती है, उदाहरण के लिए, एक अपवाद उठाने पर जब एक ऑपरेशन रनटाइम पर किया जाता है जिसके परिणामस्वरूप एक अतिप्रवाह। ऐसा लगता है जैसे व्यवहार ऐसे मामलों में बगों से बचने में मदद करता है जहां डेवलपर ओवरफ्लो की संभावना के कारण खाते की उपेक्षा करता है, जो उस लिखित कोड को लिखते हैं जो एक अंकगणितीय ऑपरेशन करता है जिसके परिणामस्वरूप अतिप्रवाह हो सकता है (इन भाषाओं में "अनचेक" कीवर्ड की तरह कुछ शामिल हो सकता था जो उस ब्लॉक को नामित कर सकता था जहां एक अपवाद के बिना उत्पन्न होने वाले पूर्णांक को अनुमति दी जाती है, उन मामलों में जहां यह व्यवहार स्पष्ट रूप से डेवलपर द्वारा किया गया है; सी # वास्तव में यह है )

क्या इसका उत्तर केवल प्रदर्शन को उगलता है – भाषा डिजाइनर अपनी संबंधित भाषाओं को "धीमी" अंकगणित पूर्णांक संचालन के लिए डिफ़ॉल्ट नहीं चाहते थे, जहां रनटाइम को प्रत्येक लागू अंकगणित पर अतिप्रवाह होने की जांच करने के लिए अतिरिक्त कार्य करने की आवश्यकता होगी ऑपरेशन – और इस प्रदर्शन पर विचार के मामले में "मूक" विफलताओं से बचने के मूल्य से अधिक हो गया है जो कि एक अनजान अतिप्रवाह होता है?

क्या प्रदर्शन के अलावा इस भाषा के डिजाइन के निर्णय के अन्य कारण भी हैं?

Solutions Collecting From Web of "डिफ़ॉल्ट रूप से पूर्णांक अतिप्रवाह पर भाषाएं क्यों नहीं बढ़ाती हैं?"

सी # में, यह प्रदर्शन का सवाल था। विशेष रूप से, आउट-ऑफ-बॉक्स बेंचमार्किंग

जब सी # नया था, माइक्रोसॉफ्ट उम्मीद कर रहा था कि बहुत से सी + + डेवलपर्स इसे स्विच करेंगे वे जानते थे कि कई सी ++ लोगों ने सी ++ के बारे में सोचा था कि तेजी से, विशेष रूप से उन भाषाओं की तुलना में तेज़ है जो स्वत: मेमोरी प्रबंधन और जैसे जैसे "व्यर्थ"

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

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

मुझे लगता है कि यह स्पष्ट है कि 99% समय हम चाहते हैं / पर होना चाहिए। यह एक दुर्भाग्यपूर्ण समझौता है

मुझे लगता है कि प्रदर्शन बहुत अच्छा कारण है। यदि आप किसी विशिष्ट प्रोग्राम में हर निर्देश को मानते हैं जो एक पूर्णांक को बढ़ाता है, और अगर साधारण ऑप्शन 1 को जोड़ने के बजाय, तो प्रत्येक समय की जांच करनी पड़ती है, 1 जोड़ते समय प्रकार का प्रवाह होगा, फिर अतिरिक्त चक्रों में लागत बहुत गंभीर होगी

आप धारणा के तहत काम करते हैं कि पूर्णांक ओवरफ़्लो हमेशा अवांछित व्यवहार होता है

कभी-कभी पूर्णांक अतिप्रवाह वांछित व्यवहार होता है मैंने देखा है एक उदाहरण एक निश्चित बिंदु संख्या के रूप में एक निरपेक्ष शीर्षक मूल्य का प्रतिनिधित्व है। एक अहस्ताक्षरित पूर्णांक को देखते हुए, 0 या 360 डिग्री और अधिकतम 32 बिट हस्ताक्षरित पूर्णांक (0xffffffff) 360 डिग्री से नीचे का सबसे बड़ा मान है।

 int main() { uint32_t shipsHeadingInDegrees= 0; // Rotate by a bunch of degrees shipsHeadingInDegrees += 0x80000000; // 180 degrees shipsHeadingInDegrees += 0x80000000; // another 180 degrees, overflows shipsHeadingInDegrees += 0x80000000; // another 180 degrees // Ships heading now will be 180 degrees cout << "Ships Heading Is" << (double(shipsHeadingInDegrees) / double(0xffffffff)) * 360.0 << std::endl; } 

संभवत: ऐसे अन्य स्थितियां हैं जहां अतिप्रवाह स्वीकार्य हैं, इस उदाहरण के समान।

यह 99% प्रदर्शन की संभावना है एक्स 86 पर हर ऑपरेशन पर ओवरफ्लो फ्लैग को जांचना होगा जो एक बड़ा प्रदर्शन हिट होगा।

अन्य 1% उन मामलों को कवर करेंगे जहां लोग फैंसी बिट जोड़-तोड़ कर रहे हैं या हस्ताक्षर किए और अहस्ताक्षरित संचालन के मिश्रण में 'असंभव' हैं और अतिप्रवाह अर्थशास्त्र चाहते हैं।

ओवरफ़्लो की जांच करने में समय लगता है। प्रत्येक प्रारंभिक गणितीय ऑपरेशन, जो सामान्य रूप से एक विधानसभा अनुदेश में अनुवादित होता है, को ओवरफ्लो के लिए एक जांच शामिल करना होगा, जिसके परिणामस्वरूप कई असेंबली निर्देश हो सकते हैं, संभावित रूप से एक प्रोग्राम में जिसके परिणामस्वरूप कई बार धीमा हो जाता है।

सी / सी ++ जाल व्यवहार को जनादेश कभी नहीं। यहां तक ​​कि 0 द्वारा स्पष्ट विभाजन सी ++ में अनिर्धारित व्यवहार है, एक विशिष्ट प्रकार का जाल नहीं है

सी भाषा में फँसाने की कोई अवधारणा नहीं है, जब तक कि आप संकेतों को नहीं गिनाते

सी ++ के पास एक डिजाइन सिद्धांत है, जो इसे उपरोक्त नहीं पेश करता है जब तक कि आप इसके लिए नहीं पूछें। तो स्ट्राउटस्ट्रैप को यह जनादेश नहीं देना होता था कि पूर्णांक उस तरह से व्यवहार करते हैं जिससे किसी भी स्पष्ट जांच की आवश्यकता हो।

कुछ प्रारंभिक कंपाइलर और सीमित हार्डवेयर के लिए हल्के कार्यान्वयन, अपवादों का समर्थन नहीं करते हैं, और अपवाद अक्सर संकलक विकल्पों के साथ अक्षम हो सकते हैं भाषा के लिए अंतर्निहित अपवाद अनिवार्य समस्या होगी।

भले ही C ++ ने इंटिजर्स की जांच की हो, शुरुआती दिनों में 99% प्रोग्रामर बंद हो जाएंगे तो प्रदर्शन को बढ़ावा देने के लिए बंद हो जाएगा …

पिछली संगतता एक बड़ा है सी के साथ, यह माना जाता था कि आप अपने डेटाटेप्स के आकार के लिए पर्याप्त ध्यान दे रहे थे कि अगर कोई ओवर / अंडरफ़्लो हुआ, तो यही वह वही था जो आप चाहते थे फिर सी ++, सी # और जावा के साथ, "अंतर्निर्मित" डेटा प्रकारों के काम करने के तरीके में बहुत कम बदलाव आया।

एसीआईडी ​​जैसी व्यवहार के साथ प्रोग्रामिंग भाषाओं को बनाने के लिए इच्छाओं की विरासत के लिए रनटाइम पर त्रुटियों को डिफ़ॉल्ट रूप से क्यों नहीं उठाया जाए, इसकी मेरी समझ। विशेष रूप से, सिद्धांत है कि जो कुछ भी आप इसे करने के लिए कोड (या कोड नहीं) करते हैं, वह ऐसा करेंगे (या नहीं)। यदि आपने कुछ त्रुटि हैंडलर को कोडित नहीं किया है, तो मशीन कोई त्रुटि हैंडलर के आधार पर "मान लेंगे", कि आप वाकई हास्यास्पद, दुर्घटनाग्रस्त चीज़ करना चाहते हैं, जो आप इसे करने के लिए कह रहे हैं।

(एसीआईडी ​​संदर्भ: http://en.wikipedia.org/wiki/ACID )