थोड़ा अलग उदाहरण:
const int *global_ptr = 0;
void bar();
void foo() {
int x = 1;
global_ptr = &x;
bar();
std::cout << x << "\n";
}
संकलक क्योंकि सभी यह जानता है के लिए, bar()
global_ptr
का मूल्य लेता है, int*
में बदल देता है, और x
को संशोधित करता है के माध्यम से, मूल्य 1
उपयोग करने के लिए अंतिम पंक्ति अनुकूलित नहीं कर सकते यह। यह कुछ हद तक जोखिम भरा कोडिंग होगा, लेकिन एक कॉन्स क्वालीफायर और उत्परिवर्तन कास्टिंग मान्य है, बशर्ते संदर्भ वास्तव में उत्परिवर्तनीय है, इसलिए संकलक को इसके लिए अनुमति देनी चाहिए।
लेकिन, अगर x
const
चिह्नित किया गया तो यह स्थिरांक दूर डाली और उत्परिवर्तित को bar()
के लिए अमान्य होगा, और इसलिए अनुकूलक माना कि x
अभी भी मूल्य 1
जब यह छपा है रखती है नि: शुल्क है।
अनुकूलक निश्चित रूप से इस तरह के अनुकूलन के लिए संकलन-समय स्थिरांक की पहचान करते हैं, इसलिए मुझे आश्चर्य नहीं होगा कि यह उत्सर्जित कोड में अंतर डालता है। प्रदर्शन में कितना अंतर आता है, मुझे नहीं पता। उदाहरणों को उत्पन्न करना मुश्किल नहीं है, जहां निरंतर पहचान कर सकते हैं उदाहरण के लिए कुछ (सस्ता) बिट ट्विडलिंग के साथ एक (महंगी) विभाजन को प्रतिस्थापित करें, या x
से जुड़े अभिव्यक्तियों को अनुमति दे सकते हैं और रनटाइम के बजाय संकलन समय पर अन्य स्थिरांकों का एक समूह गणना की जा सकती है। इसकी भी गैर स्थिरांक मामले में x
संशोधित
इसके अलावा, लिंक समय अनुकूलन bar
inlined किया जाना है, जो मामले में कड़ी समय अनुकूलक और अधिक बारीकी से उसकी सामग्री का निरीक्षण कर सकते अनुमति दे सकते हैं, और बाहर शासन करने में सक्षम हो सकता है।
आपके उदाहरण में, हालांकि, colors
का कोई सन्दर्भ अज्ञात कोड से बच सकता है, इसलिए अंतर उत्पन्न नहीं होता है। वैसे भी, एक कॉन्स स्ट्रिंग शायद एक कॉन्स int की तुलना में अनुकूलित करने के लिए कठिन है, इसलिए const
का उपयोग करके कुछ शानदार ऑप्टिमाइज़ेशन सक्षम करने के लिए भी कम संभावना है।
स्रोत
2011-08-03 23:47:06
क्या आप अक्सर इस समारोह को कॉल करते हैं? – Cameron
@ टॉमी: स्ट्रिंग को बदले में कॉपी किया गया है, क्योंकि यह रिटर्न-बाय-वैल्यू है। – Cameron
@ कैमरॉन: व्हाउप्स, किसी कारण से मैंने सोचा कि वह एक सूचक वापस कर रहा था। –