2012-03-14 9 views
43

documentation कहता है:क्या कोई कारण है कि किसी फ़ंक्शन के लिए INLINABLE Pragma का उपयोग न करें?

  • इनलाइन कहते हैं जबकि "कृपया मुझे इनलाइन", INLINABLE का कहना है:

    एक {- - # INLINABLE च #} एक समारोह च पर pragma निम्नलिखित व्यवहार है "मुझे इनलाइन करने के लिए स्वतंत्र महसूस करें; अपने विवेक का प्रयोग करें"। दूसरे शब्दों में पसंद जीएचसी को छोड़ दिया जाता है, जो प्रागमा मुक्त कार्यों के समान नियमों का उपयोग करता है। इनलाइन के विपरीत, यह निर्णय कॉल साइट पर किया जाता है, और इसलिए इनलाइनिंग थ्रेसहोल्ड, ऑप्टिमाइज़ेशन लेवल इत्यादि से प्रभावित होगा

  • इनलाइन की तरह, इनलाइन प्रागमा इनलाइन उद्देश्यों के लिए मूल आरएचएस की एक प्रति रखती है, और बनी रहती है आरएचएस के आकार के बावजूद, यह इंटरफ़ेस फ़ाइल में।

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

  • अंतर्निहित प्रज्ञा भी विशेष के साथ काम करती है: यदि आप फ़ंक्शन एफ को अनिवार्य रूप से चिह्नित करते हैं, तो आप बाद में किसी अन्य मॉड्यूल में विशेषीकृत कर सकते हैं (धारा 7.16.8, "विशेष प्रगति" देखें)।

  • इनलाइन के विपरीत, रिकर्सिव फ़ंक्शन पर एक अनिवार्य प्रगति का उपयोग करना ठीक है। प्रिंसिपल कारण तो विशेषज्ञ

यह का नुकसान क्या है के बाद के उपयोग की अनुमति देने के लिए करते हैं?

क्या यह इंटरफ़ेस फ़ाइलों को बहुत अधिक बनाता है, बहुत बड़ा? क्या यह संकलन को धीमा कर देता है?

क्या कोई कारण है कि मुझे लिखने वाले प्रत्येक निर्यात किए गए कार्य पर एक अनिवार्य प्रगति नहीं डालना चाहिए? क्या कोई कारण है कि जीएचसी मेरे द्वारा लिखे गए प्रत्येक निर्यात किए गए फ़ंक्शन पर एक अनिवार्य प्रगति नहीं डालता है?

उत्तर

49

वहाँ INLINABLE का उपयोग करने और बिल्कुल नहीं एक pragma का उपयोग कर के बीच तीन अंतर हैं: INLINABLE साथ जबकि,

  • INLINABLE के बिना, परिभाषा है कि इंटरफेस फ़ाइल में चला जाता है कोड अनुकूलन के बाद है यह, वह कोड है जिसे आपने लिखा था (अधिक या कम)। विशेष रूप से, बिना किसी अंतर्निहित, जीएचसी फ़ंक्शन की परिभाषा में अन्य कार्यों को रेखांकित कर सकता है।

  • इनलाइन के बिना, जीएचसी इंटरफ़ेस फ़ाइल से परिभाषा को छोड़ देगा यदि यह बहुत बड़ा है। अगर कुछ अन्य फ़ंक्शन दाएं हाथ में घुमाए गए हैं, तो यह आसानी से सीमा पर इसे धक्का दे सकता है।

  • इनलाइनबल कुछ चालाक मशीनरी भी चालू करता है जो स्वचालित रूप से अधिभारित फ़ंक्शंस का उपयोग करता है जहां उनका उपयोग किया जाता है, और अन्य मॉड्यूल के साथ विशेष संस्करणों को साझा करता है जो मॉड्यूल को पारगमन रूप से आयात करते हैं जिसमें विशेष संस्करण बनाया गया था।

+9

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

+4

मैंने जानबूझकर व्यावहारिक ramifications के बारे में बात से परहेज किया, क्योंकि अधिकांश भाग के लिए मुझे यकीन नहीं है :-) मैंने साइमन पीजे को अविश्वसनीय जोड़ने के लिए आश्वस्त किया क्योंकि मैं इनलाइन का एक संस्करण चाहता था जिसने जीएचसी का उपयोग करके इतना कोड ब्लोट नहीं बनाया इनलाइन के बारे में काफी परिष्कृत हेरिस्टिक। अपने पहले प्रश्न का उत्तर देने के लिए: नहीं, मूल मॉड्यूल (जैसे INLINE के साथ) में संकलित फ़ंक्शन का एक अनुकूलित संस्करण भी होगा, और इसका उपयोग कॉल के लिए किया जाएगा जो रेखांकित नहीं थे। इंटरफ़ेस में फ़ंक्शन परिभाषाओं सहित कई चीजें धीमा हो सकती हैं। –

+0

हम्म, ठीक है। इसका उपयोग कब करें और इसका उपयोग न करने के बारे में कुछ दिशानिर्देश रखना अच्छा लगेगा, लेकिन मुझे लगता है कि मुझे प्रयोग करना होगा। :) – glaebhoerl

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

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