क्या जीसीसी, सी ++ कोड संकलित करते समय कभी भी इनलाइन फ़ंक्शंस को चुनकर गति के लिए ऑप्टिमाइज़ करने का प्रयास करता है जो inline
कीवर्ड के साथ चिह्नित नहीं हैं?क्या जीसीसी इनलाइन सी ++ 'इनलाइन' कीवर्ड के बिना काम करता है?
उत्तर
हां। जब भी ऐसा लगता है कि यह एक अच्छा विचार है, तो कोई भी कंपाइलर किसी भी फ़ंक्शन को इनलाइन करने के लिए स्वतंत्र है। जीसीसी भी करता है।
एटी-ओ 2 ऑप्टिमाइज़ेशन स्तर इनलाइनिंग तब किया जाता है जब संकलक सोचता है कि यह करने योग्य है (एक ह्युरिस्टिक का उपयोग किया जाता है) और यदि यह कोड के आकार में वृद्धि नहीं करेगा। At -O3 यह तब भी किया जाता है जब संकलक सोचता है कि यह करने योग्य है, भले ही यह कोड के आकार को बढ़ाए। इसके अतिरिक्त, ऑप्टिमाइज़ेशन के सभी स्तरों (सक्षम ऑप्टिमाइज़ेशन) पर, स्थैतिक फ़ंक्शंस जिन्हें केवल एक बार कहा जाता है, इनलाइन हैं।
जीसीसी के संबंध में कहते हैं '-फिनलाइन-फ़ंक्शंस' "इनलाइनिंग के लिए सभी कार्यों पर विचार करें, भले ही उन्हें इनलाइन घोषित न किया जाए।" मैं अनुमान लगाता हूं कि 'इनलाइन' के साथ घोषित किए गए कार्यों को कोड आकार बड़ा करने के बावजूद इनलाइनिंग के लिए विचार किया जाएगा? कई दावा करते हैं कि 'इनलाइन' से कंपाइलर तक संकेत अप्रचलित है। लेकिन इसका मतलब यह होगा कि' -O2' संकेत 'अप्रचलित नहीं होगा क्योंकि इससे केवल इनलाइन फ़ंक्शंस होंगे जो कोड को' इनलाइन 'कीवर्ड रखते हैं। हालांकि, -ओ 3 'यह अप्रचलित होगा (मैं मतलब संकेत ... 'इनलाइन' कीवर्ड के अन्य उद्देश्यों हैं)। –
मुझे एक ऐसा फ़ंक्शन बनाने में परेशानी हो रही है जो '-O2' के साथ रेखांकित करने के लिए बड़ी है। प्रत्येक कार्य जो मैं बनाता हूं जो -O3 के साथ रेखांकित है -ओ 2 के साथ भी रेखांकित किया गया है।'-फिनलाइन-छोटे-फ़ंक्शन' के संबंध में जीसीसी का कहना है, "उनके कॉलर्स में फ़ंक्शंस को एकीकृत करें जब उनका शरीर अपेक्षित फ़ंक्शन कॉल कोड से छोटा होता है (इसलिए प्रोग्राम का समग्र आकार छोटा हो जाता है)"। हालांकि, जब मैं असेंबली को -ओ 2 के साथ भी देखता हूं तो यह स्पष्ट रूप से कोड को बड़ा बनाता है। क्या आपके पास एक उदाहरण है जहां ओ 3 इनलाइन है लेकिन ओ 2 नहीं है? –
@AnT कंपाइलर को फ़ंक्शन को इनलाइन करने से कैसे रोकें जिसे केवल एक बार कहा जाता है। – bharath
हां, खासकर यदि आपके पास उच्च स्तर के अनुकूलन सक्षम हैं।
एक ध्वज है जिसे आप संकलक को अक्षम करने के लिए प्रदान कर सकते हैं: -फनो-इनलाइन-फ़ंक्शंस।
असल में, -फनो-इनलाइन-फ़ंक्शंस स्वचालित इनलाइनिंग को दबाता है, और -फनो-इनलाइन सभी इनलाइनिंग को दबाता है (स्रोत: http://gcc.gnu.org/onlinedocs/gnat_ugn_unw/Switches-for-gcc.html) – KeatsPeeks
ठीक है, मैं आपकी टिप्पणी के आधार पर अपडेट करूंगा, इसके लिए धन्यवाद। – Marcin
यदि आप '-फिनलाइन-फ़ंक्शंस' या '-ओ 3' का उपयोग करते हैं तो यह इनलाइन फ़ंक्शंस करेगा। आप यह भी ट्यून करने के लिए '-finline_limit = N' का उपयोग कर सकते हैं कि यह कितना इनलाइन करता है।
"-O3 यह विकल्प अधिक महंगा अनुकूलन पर बदल जाता है, इस तरह के समारोह इनलाइन किए जाने वाले के रूप में"
वे महंगे हैं कि फ़ंक्शन अनिवार्य रूप से डुप्लिकेट किया गया है, गति के लिए स्मृति बलिदान। –
@ एपे-इनगो: यह निर्भर करता है ... ऑपरेटरों और एक्सेसर्स जैसे छोटे सामान्य कार्यों के लिए, इनलाइन संस्करण अक्सर कम महंगे होते हैं क्योंकि फ़ंक्शन कॉल के आसपास रजिस्टरों को सहेजने और पुनर्स्थापित करने के बजाय इनलाइन में कम निर्देश लेते हैं। – Adisak
* संभावित रूप से महंगा * –
हाँ, यह करता है, हालांकि यह भी एक गैर inlined उत्पन्न होगा गैर-static
गैर-inline
कार्यों के लिए फ़ंक्शन बॉडी क्योंकि अन्य अनुवाद इकाइयों से कॉल के लिए इसकी आवश्यकता है।
inline
फ़ंक्शंस के लिए, फ़ंक्शन बॉडी प्रदान करने में विफल होने में त्रुटि होती है यदि फ़ंक्शन किसी विशेष अनुवाद इकाई में उपयोग किया जाता है, तो यह कोई समस्या नहीं है।
- 1. सी: क्या इनलाइन कीवर्ड इसके लायक है?
- 2. एफ # इनलाइन कैसे काम करता है?
- 3. सी # इनलाइन गुण करता है?
- 4. जीसीसी सी ++ और इनलाइन असेंबली कोड?
- 5. जीसीसी इनलाइन असेंबली कोड में% सी का क्या अर्थ है?
- 6. जीसीसी इनलाइन असेंबली में लेबल
- 7. सी ++ इनलाइन कक्षा क्या है?
- 8. इनलाइन समारोह डुप्लिकेट प्रतीकों जीसीसी
- 9. एक जीसीसी इनलाइन कोडांतरक परिवर्तित इनलाइन कोडांतरक डेल्फी
- 10. डेल्फी में इनलाइन कीवर्ड के उपयोग
- 11. एसएसई 2 इंट्रिनिक्स और जीसीसी इनलाइन असेंबलर
- 12. इनलाइन एएसएम
- 13. "इनलाइन थ्रेड" क्या है?
- 14. जीसीसी इनलाइन-विधानसभा: फोन DWORD ptr
- 15. सी ++ की "इनलाइन" - जीसीसी और क्लैंग/एलएलवीएम के लिए यह कितना मजबूत संकेत है?
- 16. अपडेटेडः पर्ल इनलाइन :: सी
- 17. इनलाइन जावास्क्रिप्ट (एचटीएमएल) में कैसे काम करता है?
- 18. सी # इनलाइन सशर्त [] सरणी
- 19. बाइट्स इनलाइन
- 20. इनलाइन को
- 21. "इनलाइन सी '-question
- 22. सी ++ जीसीसी का उपयोग करते हुए इनलाइन फ़ंक्शन - कॉल क्यों?
- 23. छवि का उपयोग क्यों करता है: इनलाइन लेकिन इनलाइन-ब्लॉक तत्व की तरह व्यवहार करता है
- 24. एफ # इनलाइन कारण 11x प्रदर्शन सुधार क्यों करता है
- 25. 'इनलाइन' और उद्धरण मूल्यांकन
- 26. जीसीसी इनलाइन असेंबली: ब्लॉक के बाहर लेबल पर जाएं
- 27. इनलाइन फंक्शन
- 28. क्या जेआईटी कंपाइलर अनावश्यक परिवर्तनीय घोषणाओं को इनलाइन (इनलाइन) अनुकूलित करता है?
- 29. क्या संकलक तय करता है कि मेरे कार्यों को इनलाइन करने के लिए कब (सी ++ में)?
- 30. क्या जावास्क्रिप्ट को इनलाइन
spec के अनुसार, C++ में 'इनलाइन' कीवर्ड का एक ही नाम के साथ कंपाइलर अनुकूलन के साथ कुछ लेना देना नहीं है। कीवर्ड का अर्थ केवल यह है कि लिंकर को फ़ंक्शन की कई परिभाषाओं को देखने की अपेक्षा करनी चाहिए। इनलाइन * अनुकूलन * को आसान बनाने के लिए ऐसा ही होता है (क्योंकि पूर्ण परिभाषा एकाधिक अनुवाद इकाइयों में दिखाई दे सकती है), लेकिन यह उतना ही करीब है जितना उन्हें मिलता है। कंपाइलर उन कार्यों को रेखांकित कर सकता है जिन्हें 'इनलाइन' के रूप में चिह्नित नहीं किया गया है, और 'इनलाइन' के रूप में चिह्नित फ़ंक्शंस को संकलक द्वारा आवश्यक रूप से रेखांकित नहीं किया गया है। – jalf
ध्यान दें कि वर्ग परिभाषा के अंदर परिभाषित विधियां (यानी '{...}; 'के बीच डिफ़ॉल्ट रूप से' इनलाइन' 'हैं, यहां तक कि कीवर्ड के बिना भी। – MSalters