2013-01-09 13 views
10

क्या सी ++ में इनलाइन बनाने के लिए ऑपरेटरों और अन्य तरीकों के बीच कोई अंतर है? मैंने इसकी खोज की है, लेकिन यह एक आम सवाल नहीं है, जैसा कि मैंने देखा है। क्या इसका उपयोग करने या इससे बचने का कोई मजबूत कारण है? नोट: स्पष्ट रूप से, मेरा मतलब है कि जब वे छोटे होते हैं तो इनलाइन ऑपरेटरों का मतलब है।इनलाइन ऑपरेटर अच्छे हैं?

+4

खैर इनलाइनिंग जब तक आप संकलक विशिष्ट बातें उपयोग करते हैं, आप लेकिन संकलक अप करने के लिए नहीं है:

एक बहुत ही सरल उदाहरण operator==() और operator!=() का कार्यान्वयन है। तो सी ++ का जवाब है: इससे कोई फर्क नहीं पड़ता, इसे नियंत्रित नहीं कर सकता। – GManNickG

+0

@GManNickG: यह एक टिप्पणी के बजाय एक जवाब होना चाहिए! –

+1

@ के-बॉलो: ठीक है, यह तब समझाएगा कि 'इनलाइन' कीवर्ड वास्तव में इनलाइनिंग और मेह को कैसे नियंत्रित नहीं करता है, मुझे आलसी मिल गई है। :) – GManNickG

उत्तर

11

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

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

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

ध्यान दें कि एक तरह से संकलक हालांकि inline कीवर्ड नजरअंदाज नहीं कर सकते - "एक परिभाषा नियम" है कि मनाया जाना चाहिए, एक समारोह वास्तव में इनलाइन या नहीं का विस्तार किया गया है या नहीं की परवाह किए बिना करने के लिए कुछ विशेष संशोधन कर रहे हैं।

+2

एक ऑपरेटर ओवरलोड ** ** सिर्फ एक और फ़ंक्शन है, कोई अंतर नहीं है –

+2

@ के-बॉलो: मानक के दृष्टिकोण से, आपका स्पष्ट रूप से सही। मैं * उम्मीद करता हूं कि यह कंपाइलर के दृष्टिकोण से भी सही होगा - लेकिन एक कंपाइलर * ऑपरेटर ओवरलोड (चाहे मैं इसे अभ्यास में देखकर आश्चर्यचकित हूं) के आधार पर इनलाइनिंग के बारे में विभिन्न नियमों को लागू कर सकता हूं। । –

+0

एक कंपाइलर * किसी भी अन्य मानदंडों के आधार पर इनलाइनिंग के बारे में विभिन्न नियमों को लागू कर सकता है, जैसे कि फ़ंक्शन स्वीकार किए जाने वाले तर्कों की संख्या, या उसका नाम किसी निश्चित पैटर्न से मेल खाता है या नहीं। एक अधिभारित ऑपरेटर उस संबंध में कुछ खास नहीं है। – Wyzard

5

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

संकलक इस अनुरोध का पालन करने के लिए बाध्य नहीं है।

ऑपरेटर समान हैं - वे इनलाइन हो सकते हैं या नहीं भी हो सकते हैं।

चूंकि संकलक को इनलाइन करने के लिए मजबूर नहीं किया जा सकता है, इसलिए इनलाइन संकेतों का उपयोग करने या उपयोग करने से बचने के लिए शायद कोई मजबूत कारण नहीं है। क्योंकि वह सब कुछ हैं: संकेत।

विजुअल सी ++ में आप इनलाइनिंग को मजबूर करने के लिए __forceinline कीवर्ड का उपयोग कर सकते हैं, परिणाम बड़ा कोड और प्रदर्शन की संभावित हानि है। यह अच्छी तरह से डिज़ाइन किए गए सिस्टम में आम है जो विकल्पों को समाप्त करने (चीजों को मजबूर कर) अक्सर गरीब प्रदर्शन में परिणाम देता है। भले ही आप इस कीवर्ड का उपयोग करते हैं, न कि प्रत्येक फ़ंक्शन को सफलतापूर्वक रेखांकित किया जा सकता है।

जीसीसी इनलाइनिंग पर चर्चा की गई है here

+2

"परिणाम बड़ा कोड और प्रदर्शन की संभावित हानि है" [या यह छोटा कोड हो सकता है। या तेज़] (http://www.parashift.com/c++-faq/inline-and-perf.html) (मैं स्वीकार करता हूं कि लिंक किया गया पृष्ठ गलत रूप से 'इनलाइन' के रूप में चिह्नित इनलाइन फ़ंक्शंस को संकलित करता है) –

2

जैसा कि अन्य लोगों ने बताया है कि संकलक 'इनलाइन' एक विधि है या आमतौर पर inline कीवर्ड और कंपाइलर की अनुकूलन रणनीति के उपयोग के संबंध में आपकी ओर से नहीं है।

तो मुझे लगता है कि अधिक महत्वपूर्ण पहलू हेडर फ़ाइलों की पठनीयता है, और operator विधियों के सेट के रूप में दिखाई देने की संभावना है अंकगणितीय संचालन कार्यान्वयन, जहां उन्हें सरल बनाने के लिए सरल परिवर्तनों का उपयोग किया जा सकता है। इसलिए यदि मुझे ऐसी हेडर फ़ाइल में देखना है, तो मैं एक ओवरव्यू प्राप्त करने के लिए ऑपरेटर विधि हस्ताक्षर के तार्किक रूप से संबंधित सेट देखना चाहता हूं जो लागू है या नहीं।

class A 
{ 
public: 

    // Equality tests 
    //----------------------------------------------------------------------- 

    // This may involve some mor complex code that'll look ugly here 
    bool operator==(const A& rhs) const; 

    // Fine, this is a one liner. Code appears 'inline' (and is likely to be 
    // chosen for inlining by the compiler, no matter if inline keyword or not) 
    bool operator!=(const A& rhs) const { return !A::operator==(rhs); } 
}; 
संबंधित मुद्दे