किसी भी संकलक लायक उसके नमक बिल्कुल के लिए किसी भी अंतर्निहित प्रकार (दोनों निर्माणों के लिए एक ही मशीन-भाषा अनुक्रम उत्पन्न होगा int
, float
, आदि) जब तक बयान वास्तव में के रूप में सरल रूप में है के रूप में x = x + a;
और अनुकूलन सक्षम किया गया है । (विशेष रूप से, जीसीसी का -O0
, जो डिफ़ॉल्ट मोड है, एंटी-ऑप्टिमाइज़ेशन करता है , जैसे कि मेमोरी में पूरी तरह से अनावश्यक स्टोर सम्मिलित करना, ताकि यह सुनिश्चित हो सके कि डिबगर हमेशा परिवर्तनशील मान पा सकते हैं।)
यदि कथन अधिक जटिल है, हालांकि, वे भिन्न हो सकते हैं। मान लीजिए f
कि एक फ़ंक्शन है जो एक पॉइंटर लौटाता है, तो
*f() += a;
f
केवल एक बार कॉल करता है , जबकि
*f() = *f() + a;
दो बार फोन करता है। यदि f
साइड इफेक्ट होते हैं, तो दोनों में से एक गलत होगा (शायद बाद वाला)। यहां तक कि अगर f
साइड इफेक्ट नहीं होते हैं, तो कंपाइलर दूसरी कॉल को खत्म करने में सक्षम नहीं हो सकता है, इसलिए बाद वाला वास्तव में धीमा हो सकता है।
और जब से हम यहां C ++ के बारे में बात कर रहे हैं, तो क्लास के प्रकारों के लिए स्थिति पूरी तरह से अलग है जो अधिभार operator+
और operator+=
। यदि x
ऐसा कोई प्रकार है, तो - अनुकूलन से पहले - x += a
अनुवाद करता है
x.operator+=(a);
जबकि x = x + a
अनुवाद करता है
auto TEMP(x.operator+(a));
x.operator=(TEMP);
अब, यदि कक्षा ठीक से लिखी गई है और संकलक का अनुकूलक काफी अच्छा है, तो दोनों एक ही मशीन की भाषा उत्पन्न करेंगे, लेकिन यह सुनिश्चित नहीं है कि यह बिल्ट-इन प्रकारों के लिए है। शायद यही है कि स्ट्रॉस्ट्रुप सोच रहा है जब वह इसके इस्तेमाल को प्रोत्साहित करता है +=
।