documentation कहता है:क्या कोई कारण है कि किसी फ़ंक्शन के लिए INLINABLE Pragma का उपयोग न करें?
इनलाइन कहते हैं जबकि "कृपया मुझे इनलाइन", INLINABLE का कहना है:
एक {- - # INLINABLE च #} एक समारोह च पर pragma निम्नलिखित व्यवहार है "मुझे इनलाइन करने के लिए स्वतंत्र महसूस करें; अपने विवेक का प्रयोग करें"। दूसरे शब्दों में पसंद जीएचसी को छोड़ दिया जाता है, जो प्रागमा मुक्त कार्यों के समान नियमों का उपयोग करता है। इनलाइन के विपरीत, यह निर्णय कॉल साइट पर किया जाता है, और इसलिए इनलाइनिंग थ्रेसहोल्ड, ऑप्टिमाइज़ेशन लेवल इत्यादि से प्रभावित होगा
इनलाइन की तरह, इनलाइन प्रागमा इनलाइन उद्देश्यों के लिए मूल आरएचएस की एक प्रति रखती है, और बनी रहती है आरएचएस के आकार के बावजूद, यह इंटरफ़ेस फ़ाइल में।
इनलाइनबल का उपयोग करने का एक तरीका विशेष फ़ंक्शन इनलाइन (धारा 7.18, "विशेष अंतर्निर्मित फ़ंक्शंस") के संयोजन के साथ है। कॉल इनलाइन एफ इनलाइन एफ के लिए बहुत मुश्किल कोशिश करता है। यह सुनिश्चित करने के लिए कि एफ को रेखांकित किया जा सकता है, एफ की परिभाषा को अनिवार्य रूप से चिह्नित करना एक अच्छा विचार है, ताकि जीएचसी कितनी बड़ी हो, इस पर ध्यान दिए बिना एक खुलासा करने का अनुमान लगाए। इसके अलावा, एफ को एनएनटीएबलिंग के रूप में एनोटेट करके, आप सुनिश्चित करते हैं कि एफ के मूल आरएचएस को एफएचएच के ऑप्टिमाइज़र के जो भी यादृच्छिक अनुकूलित संस्करण के बजाए रेखांकित किया गया है।
अंतर्निहित प्रज्ञा भी विशेष के साथ काम करती है: यदि आप फ़ंक्शन एफ को अनिवार्य रूप से चिह्नित करते हैं, तो आप बाद में किसी अन्य मॉड्यूल में विशेषीकृत कर सकते हैं (धारा 7.16.8, "विशेष प्रगति" देखें)।
इनलाइन के विपरीत, रिकर्सिव फ़ंक्शन पर एक अनिवार्य प्रगति का उपयोग करना ठीक है। प्रिंसिपल कारण तो विशेषज्ञ
यह का नुकसान क्या है के बाद के उपयोग की अनुमति देने के लिए करते हैं?
क्या यह इंटरफ़ेस फ़ाइलों को बहुत अधिक बनाता है, बहुत बड़ा? क्या यह संकलन को धीमा कर देता है?
क्या कोई कारण है कि मुझे लिखने वाले प्रत्येक निर्यात किए गए कार्य पर एक अनिवार्य प्रगति नहीं डालना चाहिए? क्या कोई कारण है कि जीएचसी मेरे द्वारा लिखे गए प्रत्येक निर्यात किए गए फ़ंक्शन पर एक अनिवार्य प्रगति नहीं डालता है?
मैं व्यावहारिक विधियों को समझने की कोशिश कर रहा हूं। क्या पहला बिंदु यह है कि जहां फ़ंक्शन को रेखांकित नहीं किया गया है, तो यह अपरिवर्तित कोड का उपयोग करेगा और धीमा हो जाएगा? या अगर यह रेखांकित हो जाता है तो यह धीमा हो जाएगा लेकिन नियम आग नहीं आते हैं? या कभी-कभी यह तेजी से होगा, कभी-कभी केस-दर-मामले आधार पर धीमा होगा? दूसरी बात के बारे में, क्या डिस्क स्पेस के अलावा इंटरफ़ेस फ़ाइल में इसे शामिल करने में कोई कमी है? क्या वे इतने बड़े हो सकते हैं कि यह एक समस्या है (डिस्क बड़ी हैं)? और फिर: तीसरा बिंदु, क्या कोई कारण यह एक अनोखा अच्छा नहीं है? क्या यह कोड ब्लोट की समस्याग्रस्त मात्रा का कारण बन सकता है? – glaebhoerl
मैंने जानबूझकर व्यावहारिक ramifications के बारे में बात से परहेज किया, क्योंकि अधिकांश भाग के लिए मुझे यकीन नहीं है :-) मैंने साइमन पीजे को अविश्वसनीय जोड़ने के लिए आश्वस्त किया क्योंकि मैं इनलाइन का एक संस्करण चाहता था जिसने जीएचसी का उपयोग करके इतना कोड ब्लोट नहीं बनाया इनलाइन के बारे में काफी परिष्कृत हेरिस्टिक। अपने पहले प्रश्न का उत्तर देने के लिए: नहीं, मूल मॉड्यूल (जैसे INLINE के साथ) में संकलित फ़ंक्शन का एक अनुकूलित संस्करण भी होगा, और इसका उपयोग कॉल के लिए किया जाएगा जो रेखांकित नहीं थे। इंटरफ़ेस में फ़ंक्शन परिभाषाओं सहित कई चीजें धीमा हो सकती हैं। –
हम्म, ठीक है। इसका उपयोग कब करें और इसका उपयोग न करने के बारे में कुछ दिशानिर्देश रखना अच्छा लगेगा, लेकिन मुझे लगता है कि मुझे प्रयोग करना होगा। :) – glaebhoerl