program - polymorphism in c++




सी++ में कन्स्ट्रक्टर और डिस्ट्रक्टर इनलाइन फ़ंक्शंस हो सकते हैं? (4)

इनलाइन कीवर्ड के साथ एक फ़ंक्शन को चिह्नित करने के लिए कक्षा शरीर में फ़ंक्शन परिभाषा डालना। इसका मतलब है कि फ़ंक्शनल कंपाइलर द्वारा इनलाइन कर सकता है या नहीं। तो मुझे लगता है कि सबसे अच्छा जवाब "शायद" होगा?

वीसी ++ फ़ंक्शन का निर्माण करता है जो कि क्लास घोषणापत्र इनलाइन फ़ंक्शन के भीतर कार्यान्वित होते हैं।

अगर मैं निम्नानुसार एक वर्ग Foo घोषित करता हूं, तो क्या कन्स्ट्रक्टर और डिस्ट्रिक्टर इनलाइन फ़ंक्शन हैं?

class Foo 
{
    int* p;
public:
    Foo() { p = new char[0x00100000]; }
    ~Foo() { delete [] p; }
};

{
    Foo f;
    (f);
}

इनलाइन या न करने के लिए ज्यादातर आपके संकलक द्वारा तय किया गया है। कोड में इनलाइन केवल संकलक को इंगित करता है।
एक नियम जिसे आप पर भरोसा कर सकते हैं कि वर्चुअल फ़ंक्शंस कभी भी इनलाइन नहीं होंगे। यदि आपके बेस क्लास में वर्चुअल कन्स्ट्रक्टर / डिस्ट्रिक्टर है तो शायद कभी भी इनलाइन नहीं किया जाएगा।


कक्षा के भीतर कंस्ट्रक्टर के शरीर को परिभाषित करना, "इनलाइन" कीवर्ड के साथ वर्ग को छोड़कर फ़ंक्शन को रखने का एक ही प्रभाव डालता है।

दोनों मामलों में यह संकलक के लिए एक संकेत है एक "इनलाइन" फ़ंक्शन का मतलब यह नहीं है कि फ़ंक्शन को इनलाइन किया जाएगा। यह फ़ंक्शन और अन्य नियमों की जटिलता पर निर्भर करता है


छोटा जवाब हां है। किसी भी फ़ंक्शन को इनलाइन घोषित किया जा सकता है, और फ़ंक्शन बॉडी को क्लास की परिभाषा में डालने का यह एक तरीका है। आप यह भी कर सकते थे:

class Foo 
{
    int* p;
public:
    Foo();
    ~Foo();
};

inline Foo::Foo() 
{ 
    p = new char[0x00100000]; 
}

inline Foo::~Foo()
{ 
    delete [] p; 
}

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

आप __forceinline कीवर्ड का उपयोग कंपाइलर को बता सकते हैं कि जब आप "इस फ़ंक्शन को इनलाइन करें" कहते हैं, तो वास्तव में इसका मतलब यह है कि वास्तव में इसके लायक नहीं है। कई मामलों में, कंपाइलर वास्तव में सबसे अच्छा पता है





destructor