2015-01-19 4 views
5

मैंने अक्सर सुना है कि हेडर में कोड डालने का बुरा अभ्यास है, लेकिन कम्पाइलर को बेहतर बनाने में मदद करने के लिए आंशिक रूप से हेडर में छोटे कार्यों को रखना आम बात है।क्या आधुनिक सी/सी ++ कंपाइलर हेडर में कोड के साथ बेहतर अनुकूलित कर सकता है?

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

+1

जब आप एक हेडर फ़ाइल शामिल करते हैं, तो प्रीप्रोसेसर सचमुच उस कोड को कॉपी और पेस्ट करता है जहां आपने इसे शामिल किया था। – Andrew

+0

मेरा सुझाव है कि आप यहां एक नज़र डालें: http://programmers.stackexchange.com/questions/180904/are-header-files-actually- अच्छी –

+1

'इनलाइन' का अर्थ यह नहीं है कि "इस कोड को इनलाइन बनाएं" सी ++ में , लिंक समय नाम टकराव को हल करने के तरीके के साथ और अधिक करना है। "कोड इनलाइन डालने" का सी ++ मानक के संदर्भ में थोड़ा अर्थ नहीं है। – Yakk

उत्तर

4

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

लेकिन कंपाइलर्स कॉल किए जा रहे फ़ंक्शन के कोड को देखने में सक्षम होने का लाभ उठा सकते हैं और कर सकते हैं। यह न केवल इनलाइन फ़ंक्शंस के लिए होता है बल्कि यह भी कोई अन्य फ़ंक्शन होता है जिसका कोड दिखाई दे सकता है। कई कंपाइलर्स कोड को इनलाइन करने के बारे में एक अच्छा अनुमान लगाने का प्रयास करते हैं। कोड को रेखांकित करने से प्रोग्राम को बड़ा या छोटा, तेज या धीमा कर सकता है। यदि संकलक निर्धारित कर सकता है कि कोड को रेखांकित करते समय कोड तेज और छोटा दोनों होने की संभावना है, तो यह ऐसा करेगा। अन्यथा इसे व्यापार-बंद पर विचार करना होगा।

कई आधुनिक कंपाइलर्स लिंक-टाइम ऑप्टिमाइज़ेशन कर सकते हैं, जहां कोड को शुरू करने के लिए रेखांकित नहीं किया गया था, लिंक चरण के दौरान लिंक चरण के दौरान रेखांकित किया जा सकता है। कुछ अनुकूलन अवसर हो सकते हैं जो लिंक-टाइम तक देरी होने पर खो जाते हैं।

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

+0

अच्छी जानकारी। मेरे लिए यहां का मुख्य भाग यह है कि "कंपाइलर कॉल किए जा रहे फ़ंक्शन के कोड को देखने में सक्षम होने का लाभ उठा सकते हैं और", और यह लिंक-टाइम/पूरे-प्रोग्राम अनुकूलन के साथ भी सच है।मैंने केवल इस पर ध्यान देने योग्यता के साथ सौदा करने की उम्मीद की थी, लेकिन जो भी आप कहते हैं वह समझ में आता है, और सामान्य रूप से वास्तविक बेंचमार्किंग के लिए कोई प्रतिस्थापन नहीं लगता है। बहुत बहुत धन्यवाद! –

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