C++
इनलाइन कार्य
खोज…
परिचय
inline
विनिर्देशक के साथ परिभाषित एक फ़ंक्शन एक इनलाइन फ़ंक्शन है। इनलाइन फ़ंक्शन को एक परिभाषा नियम का उल्लंघन किए बिना गुणा किया जा सकता है, और इसलिए इसे बाहरी लिंकेज के साथ हेडर में परिभाषित किया जा सकता है। फ़ंक्शन इनलाइन संकेत को कंपाइलर को संकेत देता है कि फ़ंक्शन कोड पीढ़ी के दौरान इनलाइन होना चाहिए, लेकिन गारंटी नहीं देता है।
वाक्य - विन्यास
-
inline
function_declaration -
inline
function_definition - वर्ग {function_definition};
टिप्पणियों
आमतौर पर यदि किसी फ़ंक्शन के लिए उत्पन्न कोड पर्याप्त रूप से छोटा है तो यह एक अच्छा उम्मीदवार है। ऐसा क्यों? यदि कोई फ़ंक्शन बड़ा है और लूप में इनलाइन है, तो किए गए सभी कॉल्स के लिए, बड़े फ़ंक्शन के कोड को डुप्लिकेट किया जाएगा जिससे उत्पन्न बाइनरी आकार ब्लोट के लिए अग्रणी होगा। लेकिन, कितना छोटा पर्याप्त है?
हालांकि इनलाइन फ़ंक्शंस ओवरहेड कॉलिंग फ़ंक्शन से बचने का एक शानदार तरीका प्रतीत होता है, यह ध्यान दिया जाना चाहिए कि सभी फ़ंक्शन जो inline
चिह्नित नहीं हैं, वे इनबिल्ड हैं। दूसरे शब्दों में, जब आप inline
कहते हैं, तो यह केवल संकलक के लिए एक संकेत है, एक आदेश नहीं: संकलक फ़ंक्शन को इनलाइन करने के लिए बाध्य नहीं है, यह इसे अनदेखा करने के लिए स्वतंत्र है - उनमें से अधिकांश करते हैं। आधुनिक कंपाइलर इस तरह के अनुकूलन करने में बेहतर हैं कि यह कीवर्ड अब अतीत का एक उलटफेर है, जब प्रोग्रामर द्वारा फ़ंक्शन इनलाइनिंग के इस सुझाव को कंपाइलरों द्वारा गंभीरता से लिया गया था। यहां तक कि जब inline
नहीं करती है, तो inline
द्वारा inline
- inline
चिह्नित नहीं किए जाने वाले फ़ंक्शन भी इनलाइनर द्वारा इनवेट किए जाते हैं।
एक लिंकेज निर्देश के रूप में इनलाइन
आधुनिक C ++ में inline
का अधिक व्यावहारिक उपयोग इसे लिंकेज निर्देश के रूप में उपयोग करने से आता है। जब परिभाषित करना , घोषित नहीं करना , एक हेडर में एक फ़ंक्शन जो कई स्रोतों में शामिल होने जा रहा है, तो प्रत्येक अनुवाद इकाई के पास ओडीआर (एक परिभाषा नियम) उल्लंघन के लिए इस फ़ंक्शन की अपनी प्रति होगी; यह नियम मोटे तौर पर कहता है कि फ़ंक्शन, चर, आदि की केवल एक ही परिभाषा हो सकती है। इस उल्लंघन को रोकने के लिए, फ़ंक्शन परिभाषा को inline
स्पष्ट रूप से चिह्नित करने से फ़ंक्शन लिंकेज आंतरिक हो जाता है।
पूछे जाने वाले प्रश्न
मुझे C ++ में किसी फ़ंक्शन / विधि के लिए कीवर्ड 'इनलाइन' कब लिखना चाहिए?
केवल जब आप फ़ंक्शन को हेडर में परिभाषित करना चाहते हैं। अधिक केवल तभी जब फ़ंक्शन की परिभाषा कई संकलन इकाइयों में दिखाई दे सकती है। हेडर फ़ाइल में छोटे (एक लाइनर के रूप में) कार्यों को परिभाषित करना एक अच्छा विचार है क्योंकि यह कंपाइलर को आपके कोड को अनुकूलित करते समय काम करने के लिए अधिक जानकारी देता है। यह संकलन समय भी बढ़ाता है।
C ++ में किसी फ़ंक्शन / पद्धति के लिए मुझे 'इनलाइन' कीवर्ड कब नहीं लिखना चाहिए?
यदि आपको लगता है कि inline
तो inline
न जोड़ें, यदि कंपाइलर इसमें गति करता है।
कंपाइलर को पता नहीं चलेगा कि फंक्शन / मेथड इनलाइन कब बनाना है?
आमतौर पर, कंपाइलर आपसे बेहतर ऐसा कर पाएंगे। हालाँकि, कंपाइलर के पास इनलाइन कोड का विकल्प नहीं है, अगर उसमें फंक्शन की परिभाषा नहीं है। अधिकतम अनुकूलित कोड में आमतौर पर सभी निजी तरीकों को इनलेट किया जाता है कि आप इसके लिए पूछते हैं या नहीं।
यह सभी देखें
गैर-सदस्य इनलाइन फ़ंक्शन घोषणा
inline int add(int x, int y);
गैर-सदस्य इनलाइन फ़ंक्शन परिभाषा
inline int add(int x, int y)
{
return x + y;
}
सदस्य इनलाइन कार्य
// header (.hpp)
struct A
{
void i_am_inlined()
{
}
};
struct B
{
void i_am_NOT_inlined();
};
// source (.cpp)
void B::i_am_NOT_inlined()
{
}
फ़ंक्शन इनलाइनिंग क्या है?
inline int add(int x, int y)
{
return x + y;
}
int main()
{
int a = 1, b = 2;
int c = add(a, b);
}
उपरोक्त कोड में, जब add
इनलाइन होता है, तो परिणामी कोड कुछ इस तरह का हो जाता है
int main()
{
int a = 1, b = 2;
int c = a + b;
}
इनलाइन फ़ंक्शन कहीं नहीं देखा जाता है, इसका शरीर कॉलर के शरीर में अंतर्निर्मित हो जाता है। यदि add
को इनबिल्ट नहीं किया जाता है, तो एक फंक्शन कहा जाएगा। किसी फ़ंक्शन को कॉल करने का ओवरहेड - जैसे कि एक नया स्टैक फ्रेम बनाना, तर्कों की प्रतिलिपि बनाना, स्थानीय चर बनाना, कूदना (संदर्भ की स्थानीयता खोना और कैश मिसेज द्वारा वहाँ), आदि - को खर्च करना पड़ता है।