2013-02-07 16 views
15

के माध्यम से किसी फ़ंक्शन को रेखांकित करता है, तो मान लें कि मेरे पास मेरे प्रोग्राम में और कहीं भी मेरे कोड में कोई फ़ंक्शन है, फ़ंक्शन को फ़ंक्शन पॉइंटर के माध्यम से कॉल किया जाता है। क्या होता है यदि संकलक उस कार्य को इनलाइन करने के लिए हुआ, या संकलक को एहसास होगा कि उस फ़ंक्शन को सौंपा गया फ़ंक्शन पॉइंटर है और इसलिए इसे रेखांकित करने से बचें।क्या होता है यदि कंपाइलर फ़ंक्शन पॉइंटर

+2

हर्ब सटर के [इनलाइन रेडक्स] (http://www.drdobbs.com/inline-redux/184403879) देखें। –

उत्तर

12

जब किसी फ़ंक्शन के लिए पॉइंटर लिया जाता है, तो संकलक फ़ंक्शन के लिए आउट-ऑफ-लाइन बॉडी उत्पन्न करेगा। अन्य कॉल साइटों पर फ़ंक्शन को इनलाइन करना अभी भी संभव है।

ध्यान दें कि inline चिह्नित एक फ़ंक्शन में सभी टीयू में एक परिभाषा उपलब्ध होनी चाहिए जो इसे संदर्भित करती है, और ये परिभाषाएं समान होंगी। जिसका अर्थ यह है कि कुछ कॉल साइटों पर फ़ंक्शन को इनलाइन करना और दूसरों पर इसे बाहर रखना पूरी तरह से सुरक्षित है।

+0

क्या होता है यदि परिभाषाएं समान नहीं हैं (उदाहरण के लिए कुछ ifdef'd कोड), और लिंकर फ़ंक्शन के कई संस्करण प्राप्त करता है? 'इनलाइन' संभावित रूप से लिंकर द्वारा कमजोर प्रतीक के रूप में देखा जाता है, और आप बस पहले व्यक्ति को प्राप्त करते हैं? –

+6

@ निकोलस विल्सन जो एक विकृत कार्यक्रम होगा। –

+2

@ निकोलस विल्सन जो एक परिभाषा नियम का उल्लंघन करेगा, और इसे स्पष्ट रूप से परिभाषित व्यवहार के रूप में नहीं कहा जाता है। –

4

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

3

कोई कारण नहीं है कि फ़ंक्शन पॉइंटर का उपयोग इनलाइनिंग को रोकना चाहिए। इनलाइनिंग केस-दर-मामले आधार पर की जाती है और एक सामान्य कार्य निकाय के साथ मौजूद हो सकती है। तो एक समारोह को एक स्थान पर रेखांकित किया जा सकता है, और दूसरे में बुलाया जा सकता है।

संकलक, इसलिए, इनलाइन कहां है और यह अभी भी आपके फ़ंक्शन पॉइंटर के लिए कॉल करने योग्य फ़ंक्शन का उत्पादन करेगा।

2

न केवल संकलक इनलाइन "समारोह के अन्य कॉल", लेकिन यह अगर यह काफी समझता समारोह संकेत के माध्यम से भी इनलाइन कॉल जो समारोह के बारे में वास्तव में किया जा रहा है हो सकता है, कुछ इस तरह:

typedef void (*funcptr)(); 

void somefunc() 
{ 
    ... do stuff here ... 
} 

void indirection(funcptr *f) 
{ 
    f(); 
} 

void call_with_ptr() 
{ 
    funcptr f = somefunc(); 
    for(int i = 0; i < 100; i++) 
    { 
     indirection(f); 
    } 
} 

मेरे पास इस तरह के कोड थे, और यह संकेतों को रेखांकित किया, और फ़ंक्शन पॉइंटर का उपयोग किए बिना किसी भी कॉल को कॉल किया।

लेकिन निश्चित रूप से, यह मानता है कि संकलक कोड से कौन सा फ़ंक्शन कहलाता है - जो इस मामले में स्पष्ट है, लेकिन यदि रनटाइम निर्णय शामिल हैं, तो ऐसा नहीं हो सकता है।

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