2015-03-09 4 views
17

यदि आपके पास कोई तरीका है और आप संकलक को एक संकेत देना चाहते हैं कि इसे इनलाइन करना एक अच्छा विचार है, तो आपके पास वर्तमान में दो समाधान हैं।इनलाइन विधि: अंदर बनाम कक्षा परिभाषा

class Vector { 
private: 
    double* data_; 
    double* size_; 
    double* capacity_; 
public: 
    inline double& operator[](int k); 
    ... 
} 

double& Vector::operator[](int k) { 
    return data_[k]; 
} 
:

class Vector { 
private: 
    double* data_; 
    double* size_; 
    double* capacity_; 
public: 
    double& operator[](int k) { 
     return data_[k]; 
    } 
    ... 
} 

के रूप में इस विधि पठनीयता को कम कर सकते हैं, एक और समाधान inline कीवर्ड का उपयोग करें और कक्षा से बाहर विधि को परिभाषित करने के लिए है: पहले एक है जब आप अपने वर्ग की घोषणा पद्धतियां निर्धारित करने के लिए है

यह कोड को और अधिक पठनीय बनाता है (कम से कम मैं इसे पसंद करता हूं)। मेरे STL कार्यान्वयन को पढ़कर, मैंने पाया कि वे दोनों के मिश्रण का उपयोग करते हैं। कुछ विधियों (जो मुझे लगता है कि वास्तव में इनलाइन किया जाना चाहिए) कक्षा में परिभाषित किया गया है, और अन्य को इनलाइन कीवर्ड के साथ कक्षा से बाहर परिभाषित किया गया है। फ़ाइल कक्षा की एक टिप्पणी की घोषणा के साथ भी शुरू होता है।

तो मेरा प्रश्न निम्न है। वर्तमान कंपाइलर्स करें (मैं GCC, Clang, इंटेल, और Visual Studio) के बारे में सोच रहा हूं) इनलाइन कीवर्ड के साथ कक्षा से घोषित सदस्य फ़ंक्शन की तुलना में कक्षा के अंदर घोषित सदस्य फ़ंक्शन को रेखांकित करने की अधिक संभावना है?

टिप्पणी: यह प्रश्न When should I write the keyword 'inline' for a function/method? का डुप्लिकेट नहीं है क्योंकि मेरा प्रश्न कंपाइलर कार्यान्वयन के बारे में है। यह कहने के इन दो तरीकों से करें कि आप चाहते हैं कि उन कार्यों को रेखांकित किया जाए। एसटीएल लिखा गया तरीका बताता है कि वे नहीं हैं।

+0

http://stackoverflow.com/questions/1759300/when-should-i-write-the-keyword-inline-for-a-function-method – dhke

उत्तर

1

कक्षा परिभाषा के अंदर परिभाषित तरीके डिफ़ॉल्ट रूप से inline हैं। एक या दूसरे का चयन करना सबसे अधिक है, जब अनुकूलन की बात आती है तो कंपाइलर के लिए मामूली बाधा - यह संभवतः आपके द्वारा चुने गए मामले से कोई फर्क नहीं पड़ता।

12

inline कीवर्ड compilers के लिए एक संकेत माना जाता है, लेकिन सबसे compilers ज्यादा क्या प्रोग्रामर से इनलाइन ताकि वे आम तौर पर इस संकेत उपेक्षा तय करने में बेहतर हैं।

मुख्य (केवल?) inline कीवर्ड के लिए उपयोग करता है आजकल यह हेडर में फ़ंक्शंस को परिभाषित करने की अनुमति देता है और एकाधिक परिभाषा लिंक त्रुटियों को उत्पन्न नहीं करता है (जिसमें वास्तव में इनलाइनिंग के साथ कुछ भी नहीं है)।

इसके अलावा कृपया ध्यान दें कि इनलाइन किए जाने वाले एक समारोह कॉल साइट पर होता है तो यह मतलब नहीं है कहने के लिए एक समारोह inlined के बाद से यह कुछ स्थानों में और दूसरों में नहीं inlined किया जा सकता है (करीब कोड के आधार पर यह)।

मेरी सलाह: जो आप सोचते हैं उसका उपयोग अधिक पठनीय है क्योंकि इसका वास्तविक इनलाइनिंग पर कोई प्रभाव नहीं पड़ेगा (जब तक कि आप __forceinline (ऐसा नहीं करते) जैसे कुछ कंपाइलर का उपयोग न करें)।

+1

का संभावित डुप्लिकेट इस तथ्य को इंगित करने के लिए धन्यवाद कि एक फ़ंक्शन है रेखांकित नहीं फ़ंक्शन कॉल वह है जो रेखांकित है। लेकिन सी ++ कीवर्ड इनलाइन इस भ्रम को लागू करने में काफी अच्छा है। – InsideLoop

+0

इनलाइन के उपयोग के संकेत के लिए धन्यवाद जो एकाधिक परिभाषा लिंक त्रुटियों को नहीं देता है। लेकिन यह अभी भी व्याख्या नहीं करता है कि क्यों एसटीएल कार्यान्वयनकर्ता अभी भी टेम्पलेट कक्षाओं में इनलाइन का उपयोग करते हैं। – InsideLoop

+2

टेम्पलेट विधियों को उपयोग/तत्कालता के बिंदु पर दिखाई देने की आवश्यकता है, जिसका अर्थ है कि उन्हें कहीं शीर्षलेख में रखना। तो, विकल्प सिर्फ आपकी कक्षा में इनलाइन विधि को परिभाषित करने, या 'इनलाइन' घोषणा प्रदान करने और इसे बाद में परिभाषित करने के बीच है (लेकिन अभी भी शीर्षलेख में)। यह एक स्टाइलिस्ट पसंद है, और कॉल साइट पर इनलाइनिंग की संभावना पर आपके प्रश्न से कोई लेना देना नहीं है। – Useless

5

वर्तमान compilers करो (मैं जीसीसी, बजना, इंटेल, विजुअल स्टूडियो की सोच रहा हूँ) और अधिक एक सदस्य समारोह है कि एक सदस्य समारोह से वर्ग के अंदर घोषित किया जाता है इनलाइन कीवर्ड के साथ कक्षा से बाहर घोषित इनलाइन की संभावना है?

यह बिल्कुल भी कोई फर्क नहीं पड़ता।

जैसा कि अन्य ने ध्यान दिया है, एक आधुनिक कंपाइलर inline में एक लिंकेज संशोधक से थोड़ा अधिक है। वास्तविक इनलाइनिंग ऑप्टिमाइज़ेशन झंडे, लिंकेज आवश्यकताओं और कंपाइलर-विशिष्ट विशेषताओं द्वारा नियंत्रित होती है।

+0

मुझे लगता है कि आधुनिक कंपाइलर्स इसे अनदेखा करते हैं। लेकिन libC++ लाइब्रेरी में _LIBCPP_INLINE_VISIBILITY क्यों है, कक्षा में कुछ और कक्षा के बाहर कुछ विधि परिभाषित करता है? यह चीजों को करने का एक बहुत ही जटिल तरीका प्रतीत होता है। – InsideLoop

+1

@InsideLoop - यह डीएसओ के रूप में libC++ का निर्माण करते समय इनलाइनों की ईएलएफ दृश्यता को समायोजित करने की आवश्यकता के कारण है ताकि आप विभिन्न साझा वस्तुओं से परिभाषाओं के साथ हवा में न आएं जो libC++ को रनटाइम पर एक-दूसरे के साथ टकराते हैं। – LThode

+0

@LThode: आपकी जानकारी के लिए धन्यवाद। – InsideLoop

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