2010-01-07 11 views
31

संभव डुप्लिकेट:
Is there a performance difference between i++ and ++i in C++?सी ++ में पोस्टिनक्रिकमेंट की तुलना में तेज़ी से बढ़ाना - सच? यदि हां, तो यह क्यों है?

मैं के बारे में सुना है कि preincrements (++ i) एक सा postincrements (i ++) C++ की तुलना में तेजी है। क्या यह सच है? और इसके लिए क्या कारण है?

+0

डुप्लिकेट, डुप्लिकेट और अधिक डुप्लीकेट: http://stackoverflow.com/search?q=[c%2B%2B]+i%2B%2B+%2B%2Bi – sth

+0

कौन सा हार्डवेयर प्लेटफ़ॉर्म। मूल पूर्ववर्ती और पोस्टिनक्रिकमेंट जहां पीडीपी -11 की हार्डवेयर विशेषताएं। मशीन काम करने के तरीके की वजह से गति समान थी। किस विशिष्ट हार्डवेयर का उपयोग किया जा रहा था? –

+0

आज के अनुकूल कंप्यूटर्स के साथ, कोई अंतर नहीं है (सरल प्रकार के लिए मेरा मतलब है)। अंतर * आपके इरादे को इंगित करता है * किसी को भी जो आपके कोड को पढ़ेगा। –

उत्तर

48

पोस्ट-वृद्धि में आमतौर पर पिछले मूल्य की प्रतिलिपि रखना और थोड़ा अतिरिक्त कोड जोड़ना शामिल है। पूर्व-वृद्धि केवल यह काम करती है और रास्ते से बाहर हो जाती है। मैं आमतौर पर पूर्व-वृद्धि करता हूं जब तक कि अर्थशास्त्र बदल नहीं जाता है और बाद में वृद्धि वास्तव में आवश्यक होती है।

+1

चाहे अंतर्निहित प्रकारों के बारे में यह सच है कि आप वास्तव में ऑपरेटर का उपयोग कैसे करते हैं इस पर निर्भर करता है। उपयोगकर्ता परिभाषित प्रकारों के लिए, यह इस बात पर निर्भर करता है कि आप ऑपरेटर को कैसे कार्यान्वित करते हैं। –

+0

@Neil - अब ठीक से योग्यता प्राप्त है। – tvanfosson

8

पोस्टिनक्रिकमेंट्स को अनियंत्रित मूल्य को वापस करने के लिए ऑब्जेक्ट की एक प्रति बनाना है। कक्षा के प्रकार के लिए, यह महत्वपूर्ण हो सकता है लेकिन "int-like" प्रकारों (सहित पॉइंटर्स) के लिए, शायद यह नहीं है।

1

वास्तव में - यह निर्भर करता है। Postincrement एक प्रति की जरूरत है क्योंकि यह पुराने मूल्य को बरकरार रखता है। यदि बढ़ी हुई प्रकार एक जटिल प्रकार है (उदा। एक पुनरावर्तक) और एक साधारण प्रकार नहीं है, तो प्रीइंक्रिकमेंट पोस्टिनक्रिकमेंट से तेज है। यह केवल तभी सच है यदि आपको वृद्धि से पहले मूल्य की आवश्यकता नहीं है।

कुछ कंपाइलर्स यह भी पता लगा सकते हैं कि आपको पोस्टिनक्रिएटमेंट की आवश्यकता नहीं है और प्रतिलिपि को अनुकूलित करें - लेकिन हमेशा के रूप में - यह उस पर भरोसा करने की एक बुरी आदत है।

+0

"इस मामले में" जितना "हमेशा के रूप में" नहीं। अगर पठनीयता हड़ताल पर थी (जैसा कि प्रदर्शन पर सवाल पूछे जाने पर आम है), तो आपके कोड को चतुर गड़बड़ी के ढेर में बदलने की बुरी आदत है। इस मामले में, हालांकि, यह काफी समान है। – Pablo

4

किसी भी सभ्य कंपाइलर पर, ++ i और i ++ समान हैं यदि मान का उपयोग नहीं किया जाता है।

यदि मूल्य का उपयोग किया जाता है, तो ++ मुझे समान अर्थशास्त्र मूल्य को स्टोर करने के लिए अस्थायी की आवश्यकता होगी यदि समान अर्थशास्त्र चाहते थे।

+10

आपका मतलब है कि मैं दूसरे कथन में ++ हूं। – Daemin

+0

नहीं मैंने नहीं किया। मेरा जवाब दोबारा पढ़ें। हालांकि मैंने "पूर्व-वृद्धि" का अर्थ "पूर्व-वृद्धि" नहीं किया था। –

+0

कथन सही है। वह बढ़ने से पहले मूल्य का जिक्र कर रहा है। – ohgodnotanotherone

7

सादा प्रकार के प्रकारों के लिए अंतर जैसे कि int संभवतः नगण्य है। मुझे लगता है कि संकलक ऐसे मामलों को अनुकूलित करने में सक्षम है (उदाहरण के लिए एक उपसर्ग वृद्धि में एक पोस्टफिक्स को चालू करें)। हालांकि, जटिल प्रकारों के लिए (आमतौर पर एसटीएल इटरेटर्स अंतर ध्यान देने योग्य हो सकता है)। कंपाइलर इन मामलों में उपसर्ग में स्विच करने में सक्षम नहीं है क्योंकि ऑपरेटर वास्तव में पूरी तरह से अलग-अलग चीजें कर सकते हैं। मैं एसटीएल इटरेटर्स के लिए पोस्ट-इंकमेंटमेंट का उपयोग करने पर प्रदर्शन दंड पर कुछ पृष्ठभूमि जानकारी के लिए STL Iterators and Performance पढ़ने की अनुशंसा करता हूं (छोटी कहानी: पूर्व-वृद्धि के रूप में दो बार लगती है)।

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