2011-07-05 30 views
6

मैं सी ++ में इनलाइन फ़ंक्शंस का अध्ययन कर रहा हूं और इसके उपयोग की सीमाओं से संबंधित एक अनुभाग में आया हूं। इसे कहते हैं:टाइम्स जब इनलाइन फ़ंक्शनिंग का उपयोग नहीं किया जा सकता

संकलक भी इनलाइन किए जाने वाले प्रदर्शन नहीं कर सकते, तो समारोह का पता परोक्ष या स्पष्ट रूप से लिया जाता है।

क्या कोई मुझे बता सकता है, शायद किसी प्रकार के उदाहरण के साथ, इसका क्या अर्थ है?

+3

ओह मुझे इस नए मुक्त प्रश्न डाउनवॉट सिस्टम से नफरत है। इस सवाल के साथ क्या गलत था, लोग? –

+0

जिज्ञासा से, कौन सी किताब उस कथन को बना रही है? –

+1

+1 अज्ञात ड्राइव-डाउनवॉटर –

उत्तर

5

दो कुछ हद तक अलग निर्णय कर रहे हैं संकलक समारोह इनलाइन किए जाने वाले विषय में बनाता है:

  • एक विशेष समारोह कॉल inlined रहा है या नहीं;
  • चाहे फ़ंक्शन का एक गैर-इनलाइन संस्करण मौजूद है।

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

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

गैर-इनलाइन संस्करण का अस्तित्व फ़ंक्शन को किसी भी विशेष कॉल को रेखांकित करने से नहीं रोकेगा, हालांकि यह संभव है कि यह संकलक के निर्णय को प्रभावित कर सके, खासकर यदि यह कोड आकार के लिए अनुकूलित करने के लिए कॉन्फ़िगर किया गया हो।

संक्षेप में, आपका उद्धरण सरल है और पूरी तरह सटीक नहीं है; यदि पता लिया जाता है तो संकलक अभी भी "इनलाइनिंग" कर सकता है, यह गैर-इनलाइन संस्करण को छोड़ नहीं सकता है।

+0

धन्यवाद, पता निर्दिष्ट करने का आपका उदाहरण फ़ंक्शन पॉइंटर को वास्तव में यह समझने में सहायता करता है कि इस कथन का क्या अर्थ है। –

4

यह गलत है: फ़ंक्शन कॉल को इनलाइन करने की क्षमता 2 + 2 की गणना करके या कहीं भी फ़ंक्शन का पता ले कर प्रभावित नहीं होती है।

आप कौन सी किताब या लेख पढ़ रहे हैं?

दूसरी तरफ, यदि पता लिया जाता है तो अलग मशीन कोड फ़ंक्शन को निकालना व्यावहारिक रूप से असंभव हो सकता है।

चीयर्स & hth।,

+0

http://www.linuxtopia.org/online_books/programming_books/thinking_in_c++/Chapter09_009.html –

+0

ओह, ब्रूस एकल द्वारा "सी ++ में सोचना"। खैर, उस पुस्तक में काफी सारी त्रुटियां पिछले कुछ वर्षों में सामने आई हैं। लेकिन जहां तक ​​मुझे पता है ब्रूस ने कभी भी कुछ भी सही नहीं किया है। तो, बस सावधान रहें। वह नौसिखियों के लिए कुछ अच्छी चीजें लिखता है, लेकिन वह अर्थहीन और गलत सामान भी लिखता है। जैसा कि उसने यहाँ किया था। –

+0

जब आप गलतियों का जिक्र करते हैं, तो पुस्तक में एक प्रश्न में यह आपको एक हेडर फ़ाइल में कक्षा बनाने के लिए कहता है जिसमें प्रिंट नामक एक इनलाइन फ़ंक्शन होता है। पुस्तक समाधान में हालांकि इसमें केवल हेडर में प्रिंट() घोषणा है और इसकी परिभाषा एक पृथक फ़ाइल में है। क्या मैं यह कहकर सही हूं कि यह एक गलती भी है और यदि मैं एक हेडर फ़ाइल में एक इनलाइन फ़ंक्शन चाहता हूं तो इसमें इनलाइन फ़ंक्शन होने के लिए परिभाषा और घोषणा दोनों शामिल होनी चाहिए? –

6

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

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

+1

, पूरे कार्यक्रम अनुकूलन के लिए एक विकल्प है - जो AFAIK, हेडर में रेखांकित होने वाले किसी भी कोड को रखने की आवश्यकता बनाएगा, अनावश्यक ... – Nim

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