2009-04-02 19 views
7

कुछ समय पहले तक मेरा कोड बेस #include नरक के बहुत करीब था। हर बार जब मैंने एक हल्के ढंग से महत्वपूर्ण भी बदल दिया। एच फाइल व्यावहारिक रूप से सभी फाइलों को पुनः संकलित कर दिया गया।
इस तरह के उच्च हेडर निर्भरता का मुख्य कारण यह था कि मेरे पास कई छोटे कार्य हैं जिन्हें इनलाइन होने की आवश्यकता है और मैं इस धारणा के तहत था कि काम करने के लिए इनलाइन के लिए उन्हें कॉलिंग कोड के समान अनुवाद इकाई में होना आवश्यक है, इसलिए उन्हें आवश्यकता है हेडर में होना अन्य शीर्षकों को संकलित करने के लिए इनलाइन फ़ंक्शन के लिए हेडर में भी शामिल होना आवश्यक है, विज्ञापन को न्यूनतम।सी ++: इनलाइन फ़ंक्शंस और लिंक टाइम कोड जनरेशन

link-time code generation (विजुअल स्टूडियो में) दर्ज करें। इसका मुख्य उल्लेख यह है कि अब इनलाइन फ़ंक्शन अनुवाद इकाइयों को पार कर सकता है।
लेकिन मैं अभी भी iffy हूँ। मैं वास्तव में कैसे सुनिश्चित कर सकता हूं कि ये कार्य वास्तव में रेखांकित हैं? मुझे एहसास है कि संकलक मूल रूप से जो कुछ भी चाहता है वह कर सकता है इससे कोई फर्क नहीं पड़ता कि मैं समारोह को परिभाषित करता हूं।

क्या इनलाइनों को जांचने का कोई तरीका है?

+0

यह क्यों आवश्यक है कि इन कार्यों को रेखांकित किया गया हो? यह अजीब लगता है। आम तौर पर, आप कार्यों को रेखांकित करना चाहते हैं * जब यह प्रदर्शन * को लाभान्वित करता है, जो संकलक आमतौर पर – jalf

+0

@ रूडिगर स्टीवंस से निर्धारित करने में सक्षम होता है - असल में, यह संभव है।/एलटीसीजी ध्वज पर वीसी ++ का 'PGINSTRUMENT' विकल्प देखें। http://msdn.microsoft.com/en-us/library/xbf3tbeh%28VS.80%29.aspx –

उत्तर

1

एक बार आपके पास निष्पादन योग्य हो जाने के बाद, आप इसका निरीक्षण करने के लिए टूल का उपयोग कर सकते हैं और प्रतीक तालिकाओं में उल्लिखित कार्यों के नामों को देख सकते हैं। ऐसा एक उपकरण जो शक्तिशाली उपयोगी है Dependency Walker है।

यह निश्चित रूप से मानता है कि आप एक ऐसा निर्माण प्राप्त कर सकते हैं जो संकलक को बनाए रखने के दौरान, संकलक के साथ परेशान करने के लिए पर्याप्त अनुकूलन सेटिंग्स दोनों को जोड़ता है।

विजुअल स्टूडियो के लिए, मुझे लगता है कि "रिलीज" बिल्ड अक्सर उनसे मेल खाता है, लेकिन मुझे पूरी तरह से यकीन नहीं है।

+1

प्रतीकों को बनाए रखना डीबग जानकारी और अनुकूलन चालू होने में कोई समस्या नहीं है, लेकिन एक फ़ंक्शन को एक स्थान पर रेखांकित किया जा सकता है, और दूसरे पर नहीं। –

+0

निर्भरता वॉकर केवल निर्यात और आयातित कार्यों की सूची है।मान लीजिए मेरे पास प्रतीक हैं, मैं इसमें से एक पाठ्य सूची कैसे प्राप्त कर सकता हूं? – shoosh

+0

ओह, मेरे बुरे, मुझे एहसास नहीं हुआ था। शायद 'एनएम' यूनिक्स उपकरण का यह बंदरगाह चाल है: । – unwind

3

निश्चित रूप से आप वास्तव में परवाह नहीं करते हैं कि चीजें इनलाइन हो गई हैं - आप केवल देखभाल करते हैं कि प्रदर्शन सतही है या नहीं। लेकिन अगर आप वास्तव में जानना चाहते हैं, तो संकलक उत्पन्न कोड की जांच करें। आप असेंबलर व्यू विंडो का उपयोग करके डीबगर के माध्यम से इसे आसानी से कर सकते हैं।

3

आप कभी भी यह सुनिश्चित नहीं कर सकते कि फ़ंक्शंस इनलाइन हैं। यह चुनने के लिए संकलक पर निर्भर है। लेकिन आप इसे संकलक से जुड़े ऑब्जेक्ट कोड को खोजने की अनुमति देकर कंपाइलर के लिए इसे आसान बना सकते हैं।

वह जगह है जहां लिंक-टाइम कोड पीढ़ी आती है। कंपाइलर्स अब ऑब्जेक्ट कोड उत्पन्न नहीं करते हैं, वे इंटरमीडिएट भाषा का एक रूप उत्पन्न करते हैं और यह लिंकर है जो वास्तव में कोड को संकलित करता है।

यह देखने के लिए कि क्या रेखांकित किया गया है, मुझे डर है कि आप अपने ऑब्जेक्ट कोड के साथ असेंबली आउटपुट उत्पन्न करने के लिए बाएं हैं। इससे आपको एक निश्चित फ़ंक्शन का आह्वान करते समय उत्पादित सटीक ऑब्जेक्ट कोड पढ़ने की अनुमति मिलती है और यह बहुत स्पष्ट होगा कि वहां "कॉल" है या नहीं।

3

एक प्रोफाइलर का उपयोग करने का एक अपेक्षाकृत आसान तरीका है। यदि कोई फ़ंक्शन रेखांकित किया गया है तो आप इसे नियंत्रण ग्राफ के प्रवाह में नहीं देख पाएंगे।

7

मुझे पता है कि यह सी ++ में यह वर्जित है, लेकिन आप प्रीप्रोसेसर मैक्रोज़ के रूप में कार्यों को कार्यान्वित कर सकते हैं। क्षमा करें जबकि मैं अब साबुन से अपना मुंह धो दूंगा।

+0

+1: क्योंकि कभी-कभी आपके फ़ंक्शन को "इनलाइन" करने के लिए कंपाइलर को बताने का आखिरी मौका होता है, अगर यह बिल्कुल इनलाइन करने पर जोर देता है, भले ही आपको बिल्कुल पता चले कि प्रदर्शन बेहतर होगा :-) – mmmmmmmm

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