2011-05-04 8 views
5

का उपयोग करके संकलित किया गया है, मैं एक स्थिर पुस्तकालय संकलित कर रहा हूं जिसमें मुख्य रूप से टेम्पलेटेड वर्ग शामिल हैं। जब यह जीसीसी का उपयोग करके संकलित किया जाता है, परिणामी .a फ़ाइल लगभग 40 एमबी चिह्न के आसपास होती है। यह बहुत बड़ा है, लेकिन चल रहा templating की मात्रा के कारण पूरी तरह से अप्रत्याशित नहीं है। हालांकि, जब मैं VS2005 का उपयोग कर एक ही कोड संकलित करता हूं, परिणामी .lib फ़ाइल आ रही है (इसके लिए प्रतीक्षा करें!) 575 एमबी ..वीएस2005 का उपयोग करके संकलित करते समय विशाल स्थैतिक लाइब्रेरी फ़ाइल, सामान्य आकार जब जीसीसी

अब, जलने से पहले, मैंने देखा है: How can I get my very large program to link? और यह उपयोगी है यह समझते हुए कि टेम्पलेट संभावित रूप से libs को बड़ा बना रहे हैं, लेकिन मैं समझने में संघर्ष कर रहा हूं कि दो कंपाइलरों के आउटपुट आकार में इतने अलग क्यों हैं?

वी.एस. विकल्प हैं: (डीबग)

/Od /D "WIN32" /D "_DEBUG" /D "_LIB" /D "_WIN32_WINNT=0x0500" /D "_MBCS" /Gm /EHsc /RTC1 /MDd /W4 /nologo /c /Wp64 /Zi /TP /errorReport:prompt 

(रिलीज)

/O2 /D "WIN32" /D "NDEBUG" /D "_LIB" /D "_WIN32_WINNT=0x0500" /D "_MBCS" /FD /EHsc /MD /W4 /nologo /c /Wp64 /Zi /TP /errorReport:prompt 

किसी भी टिप्पणी या संकेत बहुत सराहना कर रहे हैं ..

+0

आप वीएस2005 ('/ डी" _DEBUG "') पर डीबग बिल्ड का निर्माण कर रहे हैं - क्या यह जीसीसी के समान है? यह काफी बड़ा अंतर कर सकता है। –

+0

आप सही हैं, यह करता है .. वीएस2005 पर रिलीज बिल्ड संस्करण * केवल * 350 एमबी है .. फिर भी कहीं भी काफी छोटा नहीं है! – StevieG

+0

क्या आप लिंकटाइम कोड पीढ़ी (एलटीसीजी) का उपयोग कर रहे हैं? यह स्थैतिक पुस्तकालयों को बहुत बड़ा बनाता है और फिर अनुकूलक लिंक-टाइम पर अंतिम कोड को कम करता है। –

उत्तर

3

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

आप इसे अपने लिंकर विकल्पों में /OPT:REF /OPT:ICF के साथ सक्षम कर सकते हैं। लेकिन यह रिलीज निर्माण में डिफ़ॉल्ट रूप से होना चाहिए।

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

आप अन्य स्रोत फ़ाइलों को संकलित करते समय स्वत: तत्कालता को रोकने के लिए एक .cpp में आवश्यक टेम्पलेट उदाहरणों को स्पष्ट रूप से तत्काल करके और extern template का उपयोग करके कुछ स्थान सहेजने में सक्षम हो सकते हैं।

+0

हाँ, मैं निश्चित रूप से हूं सामान्य रूप से आकार को कम करने के लिए इन पंक्तियों के साथ सोच रहा है .. लेकिन फिर भी मेरे सिर को नहीं मिल सकता है, यह बिना किसी स्पष्ट तत्कालता या अन्य कोडिंग अनुकूलन के जीसीसी में इतना बेहतर क्यों है ... – StevieG

+0

मुझे भी। मुझे आश्चर्य है कि यह फ़ंक्शन-स्तरीय लिंकिंग से संबंधित है (/ Gy,/O2 द्वारा निहित)। यह एक अच्छा अनुकूलन है, लेकिन इसे ऑब्जेक्ट फ़ाइलों में ओवरहेड को बढ़ाना चाहिए - विशेष रूप से यदि आपके पास बार-बार बहुत कम इनलाइन फ़ंक्शंस उत्पन्न होते हैं। आप रिलीज मोड में/Gy- निर्दिष्ट करने का प्रयास कर सकते हैं यह देखने के लिए कि क्या इससे कोई फर्क पड़ता है। –

+0

इस उत्तर को सबसे उपयोगी के रूप में स्वीकार करते हुए, हालांकि समस्या अभी भी बनी हुई है। – StevieG

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