2011-10-24 18 views
5

मेरे पास एक साधारण वर्ग है:क्या गेटटर की शून्य लागत है?

class A { 
    public: 
    int get() const; 

    private: 
    void do_something(); 
    int value; 
} 

int A::get() const { 
    return value; 
} 

गेटर फ़ंक्शन सरल और सीधा है। गेटर्स का उपयोग करना है, इसलिए value तक पहुंचने के लिए मुझे dzs28 में get() का उपयोग करना चाहिए। मेरा सवाल है: क्या कंपाइलर गेटटर को ऑप्टिमाइज़ करेगा, तो यह सीधे डेटा तक पहुंचने के बराबर होगा? या अगर मैं इसे सीधे एक्सेस करता हूं तो मैं अभी भी प्रदर्शन प्राप्त करूंगा (क्या बदतर डिज़ाइन का संकेत देगा)?

A::do_something() 
{ 
    x = get(); 
    // or... 
    x = value; 
} 
+0

असली सवाल, ज़ाहिर है, * क्या इससे कोई फर्क पड़ता है *? क्योंकि अगर ऐसा नहीं होता है, तो कौन परवाह करता है? और यदि ऐसा होता है, तो केवल आप जांच सकते हैं कि आपका विशेष कंपाइलर अनुकूलन करता है या नहीं। –

उत्तर

7

जब विधि वर्चुअल नहीं है, तो कंपाइलर इसे अनुकूलित कर सकते हैं। अच्छा कंपाइलर्स (लिंक-टाइम ऑप्टिमाइज़ेशन के साथ) विधि को अनुकूलित कर सकता है भले ही विधि inline न हो और अलग .cpp फ़ाइल में परिभाषित न हो। इतना अच्छा नहीं केवल तभी ऐसा कर सकता है जब इसे कक्षा परिभाषा के अंदर घोषित किया गया हो, या हेडर फ़ाइल में inline कीवर्ड के साथ। आभासी तरीकों के लिए, यह निर्भर करता है, लेकिन सबसे अधिक संभावना नहीं है।

+0

'आभासी' चीज़ का उल्लेख करने के लिए अच्छा है। – iammilind

+3

आभासी कार्यों के लिए, यह इस बात पर निर्भर करता है कि संकलक गतिशील प्रकार जानता है या नहीं।जबकि वर्चुअल फ़ंक्शंस का सबसे लगातार उपयोग उन संदर्भों में होता है जहां यह नहीं हो सकता है, अपवाद हैं, और मुझे कम से कम एक मुहावरे पता है जो आभासी कार्यों को रेखांकित करने वाले कंपाइलर पर निर्भर करता है। –

3

संकलक लगभग निश्चित रूप से इस तरह के एक छोटे से गेटर को रेखांकित करेगा, अगर उसे परिभाषा तक पहुंच प्राप्त हो।

+0

क्या यह कक्षा के बाहर इसे परिभाषित करके 'इनलाइन' कीवर्ड के बिना गेटटर को रेखांकित करेगा? – ks1322

+0

@ ks1322: सदस्य कार्यों की कक्षा में परिभाषा को पूरी तरह से 'इनलाइन' के रूप में घोषित किया जाता है। – Nawaz

+0

@ नवाज, मैं पूछ रहा हूं कि इसे इस विशेष मामले में रेखांकित किया जाएगा (कोई 'इनलाइन' कीवर्ड नहीं, सदस्य फ़ंक्शन को कक्षा के बाहर ** ** परिभाषित किया गया है)? – ks1322

2

गेटर एक इनलाइन समारोह के रूप में परिभाषित किया गया है (या तो परोक्ष यह वर्ग के भीतर स्पष्ट रूप से परिभाषित करने के लिए, या inline कीवर्ड के साथ द्वारा), संकलक आम तौर पर यह इनलाइन जाएगा, और यह बुला में कोई भूमि के ऊपर नहीं होगा।

हालाँकि इस बात पर डिबग के लिए आम इनलाइन किए जाने वाले है, जो पूरी तरह से वैध के बाद से compilers कुछ भी इनलाइन की आवश्यकता नहीं है है निष्क्रिय करने के लिए बनाता है है।

1

ठीक है, प्राप्त का उपयोग कर आम तौर पर एक बेहतर डिजाइन, क्योंकि यह वास्तविक तर्क मूल्य प्राप्त करने में शामिल खाल (आज यह एक क्षेत्र है, कल यह और अधिक जटिल तर्क की आवश्यकता हो सकती है)। प्रदर्शन के लिए, मूल्य तक पहुंचने के दौरान हमेशा कम से कम जितना तेज़ होगा, संकलक संभवतः कॉल को इनलाइन कर देगा।

int& get(); 

अब यह एक संदर्भ वापस आती है और बदला जा सकता है:

1

सबसे पहले आप अगर आप एक संदर्भ नहीं लौटते बल्कि मूल्य से अपने ऑब्जेक्ट के अंदर मूल्य में हेरफेर करने में सक्षम नहीं होगा। लेकिन IMHO यह काफी साफ नहीं है, तो आप भी एक सेटर को परिभाषित करने और इसका इस्तेमाल वापस बदल मूल्य लिखने के लिए चाहिए:

int get() const; 
void set(int); 

... 
A::do_something() 
{ 
    x = get(); 
    set(value); 
} 

सेटर का प्रदर्शन आपके संकलक पर निर्भर करता है। अधिकांश आधुनिक कंपाइलर सरल गेटर्स/सेटर्स को रेखांकित करने में सक्षम होते हैं, इसलिए कोई प्रदर्शन हानि नहीं होनी चाहिए।

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