एक फ़ंक्शन कॉल की लागत से बचना केवल आधी कहानी है।
करना:
- के
inline
बजाय का उपयोग करें#define
- बहुत छोटे कार्य इसके लिए अच्छे उम्मीदवार हैं
inline
: तेज कोड और छोटे निष्पादन (कोड कैश में रहने की अधिक संभावना)
- फ़ंक्शन छोटा है और बहुत बार कहा जाता है
नहीं है:
- बड़े कार्य: बड़े निष्पादनों की ओर अग्रसर होते हैं, जो कॉलिंग ओवरहेड से होने वाले तेज निष्पादन की परवाह किए बिना प्रदर्शन को महत्वपूर्ण रूप से प्रभावित करते हैं
- इनलाइन फ़ंक्शंस जो I / O बाउंड हैं
- फ़ंक्शन का उपयोग शायद ही कभी किया जाता है
- कंस्ट्रक्टर और डिस्ट्रक्टर्स: खाली होने पर भी कंपाइलर उनके लिए कोड जनरेट करता है
- लाइब्रेरी विकसित करते समय द्विआधारी संगतता को तोड़ना:
- किसी मौजूदा फ़ंक्शन को इनलाइन करें
- इनलाइन फ़ंक्शन को बदलें या इनलाइन फ़ंक्शन को नॉन-इनलाइन बनाएं: लाइब्रेरी का पूर्व संस्करण पुराने कार्यान्वयन को कॉल करता है
एक पुस्तकालय विकसित करते समय, भविष्य में एक वर्ग को एक्स्टेंसिबल बनाने के लिए:
- गैर-इनलाइन वर्चुअल विध्वंसक जोड़ें भले ही शरीर खाली हो
- सभी बिल्डरों को इनलाइन न करें
- जब तक क्लास को मान से कॉपी नहीं किया जा सकता तब तक कॉपी कंस्ट्रक्टर और असाइनमेंट ऑपरेटर के गैर-इनलाइन कार्यान्वयन लिखें
याद रखें कि inline
कीवर्ड कंपाइलर के लिए एक संकेत है: कंपाइलर किसी फ़ंक्शन को इनलाइन नहीं करने का निर्णय ले सकता है और यह इनलाइन फ़ंक्शन को तय कर सकता inline
है जो पहले स्थान पर चिह्नित नहीं थे । मैं आमतौर पर फंक्शन मार्किंग से बचता हूंinline
(इसके अलावा बहुत छोटे कार्य लिखते समय)।
प्रदर्शन के बारे में, समझदार दृष्टिकोण (हमेशा की तरह) आवेदन को प्रोफाइल करना है, फिर अंततः inline
एक टोंटी का प्रतिनिधित्व करने वाले कार्यों का एक सेट है।
संदर्भ:
संपादित करें: ब्रेज़न स्ट्रॉस्ट्रुप, सी ++ प्रोग्रामिंग भाषा:
एक फ़ंक्शन को परिभाषित किया जा सकता है inline
। उदाहरण के लिए:
inline int fac(int n)
{
return (n < 2) ? 1 : n * fac(n-1);
}
inline
विनिर्देशक संकलक करने के लिए एक संकेत है कि इसके बारे में एक कॉल के लिए कोड उत्पन्न करने का प्रयास करना चाहिए fac()
एक बार समारोह के लिए कोड नीचे बिछाने और फिर हमेशा की तरह समारोह कॉल तंत्र के माध्यम से बुला से इनलाइन बल्कि। एक चतुर संकलक 720
एक कॉल के लिए निरंतर उत्पन्न कर सकता है fac(6)
। पारस्परिक रूप से पुनरावर्ती इनलाइन फ़ंक्शंस, इनलाइन फ़ंक्शंस की संभावना जो इनपुट आदि के आधार पर पुनरावृत्ति या नहीं करती है, यह गारंटी देना असंभव बनाता है कि किसी inline
फ़ंक्शन का प्रत्येक कॉल वास्तव में इनलाइन है। एक संकलक की चतुराई की डिग्री को निर्धारित नहीं किया जा सकता है, इसलिए एक संकलक एक 720
और उत्पन्न कर सकता है , और 6 * fac(5)
दूसरा एक अन-इनलाइन कॉलfac(6)
।
असामान्य रूप से चतुर संकलन और लिंकिंग सुविधाओं की अनुपस्थिति में इनलाइनिंग को संभव बनाने के लिए, परिभाषा और न केवल एक इनलाइन फ़ंक्शन का घोषणा-पत्र गुंजाइश में होना चाहिए (.29.2)। एक inline
especifier किसी फ़ंक्शन के शब्दार्थ को प्रभावित नहीं करता है। विशेष रूप से, एक इनलाइन फ़ंक्शन का अभी भी एक अनूठा पता है और इसलिए static
इनलाइन फ़ंक्शन के चर (.27.1.2) हैं।
EDIT2: ISO-IEC 14882-1998, 7.1.2 फ़ंक्शन विनिर्देशक
एक फ़ंक्शन घोषणा (8.3.5, 9.3, 11.4) एक inline
विनिर्देशक के साथ एक इनलाइन फ़ंक्शन घोषित करता है। इनलाइन स्पेसियर कार्यान्वयन को इंगित करता है कि कॉल के बिंदु पर फ़ंक्शन बॉडी के इनलाइन प्रतिस्थापन को सामान्य फ़ंक्शन सिस्टम तंत्र के लिए प्राथमिकता दी जानी है। कॉल के बिंदु पर इस इनलाइन प्रतिस्थापन को निष्पादित करने के लिए कार्यान्वयन की आवश्यकता नहीं है; हालाँकि, भले ही इस इनलाइन प्रतिस्थापन को छोड़ दिया गया हो, 7.1.2 द्वारा परिभाषित इनलाइन फ़ंक्शन के लिए अन्य नियमों का अभी भी सम्मान किया जाएगा।
inline
C ++ नवागंतुक केCFLAGS
लिए है कि जेंटू नवागंतुक के लिए क्या कर रहे हैं: नहीं, के साथ संकलित-O3 -funroll-loops -finline-functions
करने से आपका पेंटियम मक्खी नहीं होगा;)