2009-10-26 6 views
25

क्या जीसीसी, सी ++ कोड संकलित करते समय कभी भी इनलाइन फ़ंक्शंस को चुनकर गति के लिए ऑप्टिमाइज़ करने का प्रयास करता है जो inline कीवर्ड के साथ चिह्नित नहीं हैं?क्या जीसीसी इनलाइन सी ++ 'इनलाइन' कीवर्ड के बिना काम करता है?

+10

spec के अनुसार, C++ में 'इनलाइन' कीवर्ड का एक ही नाम के साथ कंपाइलर अनुकूलन के साथ कुछ लेना देना नहीं है। कीवर्ड का अर्थ केवल यह है कि लिंकर को फ़ंक्शन की कई परिभाषाओं को देखने की अपेक्षा करनी चाहिए। इनलाइन * अनुकूलन * को आसान बनाने के लिए ऐसा ही होता है (क्योंकि पूर्ण परिभाषा एकाधिक अनुवाद इकाइयों में दिखाई दे सकती है), लेकिन यह उतना ही करीब है जितना उन्हें मिलता है। कंपाइलर उन कार्यों को रेखांकित कर सकता है जिन्हें 'इनलाइन' के रूप में चिह्नित नहीं किया गया है, और 'इनलाइन' के रूप में चिह्नित फ़ंक्शंस को संकलक द्वारा आवश्यक रूप से रेखांकित नहीं किया गया है। – jalf

+2

ध्यान दें कि वर्ग परिभाषा के अंदर परिभाषित विधियां (यानी '{...}; 'के बीच डिफ़ॉल्ट रूप से' इनलाइन' 'हैं, यहां तक ​​कि कीवर्ड के बिना भी। – MSalters

उत्तर

31

हां। जब भी ऐसा लगता है कि यह एक अच्छा विचार है, तो कोई भी कंपाइलर किसी भी फ़ंक्शन को इनलाइन करने के लिए स्वतंत्र है। जीसीसी भी करता है।

एटी-ओ 2 ऑप्टिमाइज़ेशन स्तर इनलाइनिंग तब किया जाता है जब संकलक सोचता है कि यह करने योग्य है (एक ह्युरिस्टिक का उपयोग किया जाता है) और यदि यह कोड के आकार में वृद्धि नहीं करेगा। At -O3 यह तब भी किया जाता है जब संकलक सोचता है कि यह करने योग्य है, भले ही यह कोड के आकार को बढ़ाए। इसके अतिरिक्त, ऑप्टिमाइज़ेशन के सभी स्तरों (सक्षम ऑप्टिमाइज़ेशन) पर, स्थैतिक फ़ंक्शंस जिन्हें केवल एक बार कहा जाता है, इनलाइन हैं।

+0

जीसीसी के संबंध में कहते हैं '-फिनलाइन-फ़ंक्शंस' "इनलाइनिंग के लिए सभी कार्यों पर विचार करें, भले ही उन्हें इनलाइन घोषित न किया जाए।" मैं अनुमान लगाता हूं कि 'इनलाइन' के साथ घोषित किए गए कार्यों को कोड आकार बड़ा करने के बावजूद इनलाइनिंग के लिए विचार किया जाएगा? कई दावा करते हैं कि 'इनलाइन' से कंपाइलर तक संकेत अप्रचलित है। लेकिन इसका मतलब यह होगा कि' -O2' संकेत 'अप्रचलित नहीं होगा क्योंकि इससे केवल इनलाइन फ़ंक्शंस होंगे जो कोड को' इनलाइन 'कीवर्ड रखते हैं। हालांकि, -ओ 3 'यह अप्रचलित होगा (मैं मतलब संकेत ... 'इनलाइन' कीवर्ड के अन्य उद्देश्यों हैं)। –

+1

मुझे एक ऐसा फ़ंक्शन बनाने में परेशानी हो रही है जो '-O2' के साथ रेखांकित करने के लिए बड़ी है। प्रत्येक कार्य जो मैं बनाता हूं जो -O3 के साथ रेखांकित है -ओ 2 के साथ भी रेखांकित किया गया है।'-फिनलाइन-छोटे-फ़ंक्शन' के संबंध में जीसीसी का कहना है, "उनके कॉलर्स में फ़ंक्शंस को एकीकृत करें जब उनका शरीर अपेक्षित फ़ंक्शन कॉल कोड से छोटा होता है (इसलिए प्रोग्राम का समग्र आकार छोटा हो जाता है)"। हालांकि, जब मैं असेंबली को -ओ 2 के साथ भी देखता हूं तो यह स्पष्ट रूप से कोड को बड़ा बनाता है। क्या आपके पास एक उदाहरण है जहां ओ 3 इनलाइन है लेकिन ओ 2 नहीं है? –

+0

@AnT कंपाइलर को फ़ंक्शन को इनलाइन करने से कैसे रोकें जिसे केवल एक बार कहा जाता है। – bharath

7

हां, खासकर यदि आपके पास उच्च स्तर के अनुकूलन सक्षम हैं।

एक ध्वज है जिसे आप संकलक को अक्षम करने के लिए प्रदान कर सकते हैं: -फनो-इनलाइन-फ़ंक्शंस।

+2

असल में, -फनो-इनलाइन-फ़ंक्शंस स्वचालित इनलाइनिंग को दबाता है, और -फनो-इनलाइन सभी इनलाइनिंग को दबाता है (स्रोत: http://gcc.gnu.org/onlinedocs/gnat_ugn_unw/Switches-for-gcc.html) – KeatsPeeks

+0

ठीक है, मैं आपकी टिप्पणी के आधार पर अपडेट करूंगा, इसके लिए धन्यवाद। – Marcin

3

यदि आप '-फिनलाइन-फ़ंक्शंस' या '-ओ 3' का उपयोग करते हैं तो यह इनलाइन फ़ंक्शंस करेगा। आप यह भी ट्यून करने के लिए '-finline_limit = N' का उपयोग कर सकते हैं कि यह कितना इनलाइन करता है।

1

"-O3 यह विकल्प अधिक महंगा अनुकूलन पर बदल जाता है, इस तरह के समारोह इनलाइन किए जाने वाले के रूप में"

+0

वे महंगे हैं कि फ़ंक्शन अनिवार्य रूप से डुप्लिकेट किया गया है, गति के लिए स्मृति बलिदान। –

+1

@ एपे-इनगो: यह निर्भर करता है ... ऑपरेटरों और एक्सेसर्स जैसे छोटे सामान्य कार्यों के लिए, इनलाइन संस्करण अक्सर कम महंगे होते हैं क्योंकि फ़ंक्शन कॉल के आसपास रजिस्टरों को सहेजने और पुनर्स्थापित करने के बजाय इनलाइन में कम निर्देश लेते हैं। – Adisak

+0

* संभावित रूप से महंगा * –

1

हाँ, यह करता है, हालांकि यह भी एक गैर inlined उत्पन्न होगा गैर-static गैर-inline कार्यों के लिए फ़ंक्शन बॉडी क्योंकि अन्य अनुवाद इकाइयों से कॉल के लिए इसकी आवश्यकता है।

inline फ़ंक्शंस के लिए, फ़ंक्शन बॉडी प्रदान करने में विफल होने में त्रुटि होती है यदि फ़ंक्शन किसी विशेष अनुवाद इकाई में उपयोग किया जाता है, तो यह कोई समस्या नहीं है।

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