2009-07-30 12 views
9

मुझे समझ में आता है कि आप इनलाइन कीवर्ड का उपयोग कर सकते हैं या बस क्लास घोषणा एला शॉर्ट सीटीओ या गेटटर विधि में एक विधि डाल सकते हैं, लेकिन क्या संकलक मेरे तरीकों को इनलाइन करने के बारे में अंतिम निर्णय लेता है?क्या संकलक तय करता है कि मेरे कार्यों को इनलाइन करने के लिए कब (सी ++ में)?

उदाहरण के लिए:

inline void Foo::vLongBar() 
{ 
    //several function calls and lines of code 
} 

संकलक यह सोचता है कि यदि मेरी कोड अक्षम कर देगा मेरा इनलाइन घोषणा की अनदेखी करेंगे?

एक पक्ष इस मुद्दे के रूप में, एक गेटर विधि इस तरह मेरी कक्षा के बाहर की घोषणा की है कि अगर मैं है

void Foo::bar() { std::cout << "baz"; } 

विल कवर के तहत संकलक इनलाइन है?

उत्तर

9

हो या न हो fiunction inlined है, दिन के अंत में कुछ विवरण हैं पूरी तरह से संकलक तक। आम तौर पर, प्रवाह के संदर्भ में एक अधिक जटिल कार्य होता है, संकलक को कम इनलाइन करने की संभावना कम होती है। और कुछ फ़ंक्शन, जैसे रिकर्सिव वाले, बस इनलाइन नहीं किए जा सकते हैं।

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

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

+0

कृपया जेरेडपार के उत्तर पर मेरी टिप्पणी देखें। – jkeys

+1

रिकर्सिव फ़ंक्शंस निर्दिष्ट गहराई में रेखांकित किया जा सकता है :) – AraK

+1

कंपाइलर कैसे जानता है कि गहराई का समय संकलन समय पर क्या होता है? –

15

हां, आपके कोड को इनलाइन करने के लिए अंतिम निर्णय सी ++ कंपाइलर में है या नहीं। इनलाइन कीवर्ड एक सुझाव है, आवश्यकता नहीं है।

यहाँ, के रूप में कैसे इस निर्णय संकलक

+1

क्या आप इस बारे में विस्तार से बता सकते हैं कि यह क्यों है? मैंने सोचा कि सी ++ का बिंदु प्रोग्रामर को खुद को लटका देने के लिए पर्याप्त रस्सी देना है, लेकिन यह प्रतिबंधित लगता है। क्या कोई अच्छा कारण है? – jkeys

+1

@ हुक किया गया, मैंने पोस्ट किए गए लिंक पर एक नज़र डालें। यह थोड़ी सी जानकारी में जाता है कि यह हमेशा एक अच्छी बात क्यों नहीं है। मेरे दिमाग में आने वाली पहली वस्तु सिर रिकर्सिव फ़ंक्शन है। – JaredPar

+1

मानक कहता है कि __forceinline भी बहस खत्म नहीं करता है, संकलक अभी भी अंतिम शब्द है। मैं समझ सकता हूं कि इनलाइनिंग अनुचित क्यों होगी, लेकिन यदि कोई प्रोग्रामर/प्रोफाइलर संकलक पर सवारी करने का फैसला करता है, तो उसके विकल्प क्या हैं? यह लिंक संकलक निर्णय लेने के पीछे तर्क को विस्तारित नहीं करता है। – jkeys

1

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

+0

मैं ... क्या आपके पास उस दावे का बैक अप लेने के लिए कोई स्रोत है? – jkeys

+0

एक लूप? एक लूप क्यों? क्या आपका मतलब रिकर्सन नहीं है? –

+0

यह कार्यान्वयन-विशिष्ट है। जब कोई फ़ंक्शन इनलाइन नहीं किया जा सकता है तो मानक कुछ भी नहीं कहता है; केवल उस कार्यान्वयन का अंतिम निर्णय है। –

4

के रूप में कई पहले से ही तैनात किया है, अंतिम निर्णय हमेशा संकलक पर निर्भर है, भले ही आप इस तरह के forceinline के रूप में फर्म संकेत दे सकते हैं।
तर्क का एक हिस्सा यह है कि इनलाइनिंग स्वचालित नहीं है "तेज़ी से जाएं" स्विच। बहुत अधिक इनलाइनिंग आपके कोड को बहुत बड़ा कर सकती है, और अन्य अनुकूलन में हस्तक्षेप कर सकती है। The C++ FAQ Lite about inline functions and performance देखें।

+0

लिंक के लिए धन्यवाद। मैंने अधिकांश फैक लाइट पढ़ा है, लेकिन यह नहीं। – jkeys

2

एक पक्ष इस मुद्दे के रूप में, एक गेटर विधि इस तरह मेरी कक्षा के बाहर की घोषणा की है कि अगर मैं है

void Foo::bar() { std::cout << "baz"; } 

विल कवर के तहत संकलक इनलाइन है?

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

+0

ओह, मुझे यह नहीं पता था। मुझे पता नहीं है कि वास्तव में लिंकर क्या करता है (मैं अपने फैंसी आईडीई के साथ खराब हो गया हूं, मुझे कभी भी कमांड लाइन द्वारा संकलित नहीं करना पड़ा और प्रक्रिया के माध्यम से जाना पड़ा)। – jkeys

+0

समझना कि लिंकर कैसे काम करता है काफी पारदर्शी होना चाहिए (आपको काम करने के लिए इसे जानने की आवश्यकता नहीं है)। लेकिन यह सी ++ में इसके बारे में जानने के लिए विशेष रूप से महत्वपूर्ण होता है, क्योंकि यदि आप नहीं जानते कि लिंकर के लिए क्या दिखाई दे रहा है और क्या नहीं है तो इतनी सारी भाषा संरचनाएं आप जिस तरह से अपेक्षा करते हैं उससे काफी व्यवहार नहीं करती हैं। 'इनलाइन' सबसे बड़ा है, लेकिन' .h' और '.cpp' में क्या होता है, इसके बीच का अंतर, 'स्थिर' का अर्थ है, जहां टेम्पलेट जा सकते हैं ... ये सभी आते हैं। दुर्भाग्यवश लिंकिंग वास्तव में आपको सी ++ में यात्रा कर सकती है यदि आपको इसकी मूल समझ नहीं है। – quark

3

जैसा कि अन्य ने नोट किया है , inline कीवर्ड केवल कोड को इनलाइन करने के लिए संकलक के लिए एक सुझाव है। चूंकि संकलक नियमित रूप से इनलाइन कोड को चिह्नित करेगा जिसे inline के साथ चिह्नित नहीं किया गया है, और इनलाइन कोड नहीं है, तो कीवर्ड register या (प्री-सी ++ 0x) auto के रूप में अनावश्यक लगता है।

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

3

बस मेरे 5 सेंट जोड़ने के लिए ...

मैं बहुत उपयोगी इनलाइन करने के बारे में इस Guru of Week लेख पाया।

जहां तक ​​मुझे याद है कि मैंने कहीं पढ़ा है कि एक लिंकर भी इनलाइनिंग कर सकता है, जब यह ऑब्जेक्ट फाइलों को लिंक करता है और पाता है कि कोड को लिंक किया जा सकता है।

सादर,
Ovanes

1

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

यही कारण है कि 'इनलाइन' कीवर्ड (और यहां तक ​​कि, कुछ मामलों में, मजबूर रूपों) को मजबूर करने का एक मानक तरीका नहीं हो सकता है - आप हमेशा एक मैक्रो लिख सकते हैं।

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

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