2012-12-13 34 views
6

के लिए बहुत बड़े निष्पादन योग्य http://bellard.org/mersenne.html से प्रोग्राम के लिए ~ 130 एमबी निष्पादन योग्य बनाता है। क्यूं कर?जीसीसी उत्पादन मेर्सन प्रोग्राम

+5

यह सरणी टी [1 << 25] लगभग 12 9 एमबी मेमोरी लेती है, मुझे लगता है। – Mithrandir

उत्तर

12

t[1<<25]={2}t[1<<25] को बदलने का प्रयास करें और * निष्पादन योग्य ** का आकार 7.3 के पर गिर जाएगा। (कहने की जरूरत नहीं है, आपको सही परिणाम नहीं मिलेगा)

यदि यह केवल t[1<<25] था, तो यह किसी भी जगह पर नहीं ले जाता था।

यहाँ पकड़ है कि सरणी (पहला तत्व = 2, अगले 2^25-1 तत्वों सभी 0) प्रारंभ की जा रही है, और वैश्विक सरणी डेटा खंड केवल में रख दिया जाता है, क्योंकि यह आरंभ नहीं हो जाता है।


2 संस्करणों के लिए विधानसभा जनरेट कर रहा है और अंतर की जांच करता है तो यह और भी अधिक स्पष्ट:

[[email protected] ~]$ diff without_mem.s with_mem.s 
15c15,21 
< .comm t,134217728,32 
--- 
> .globl t 
> .align 32 
> .type t, @object 
> .size t, 134217728 
> t:        ***<- HERE!*** 
> .long 2     
> .zero 134217724 

हम देख सकते हैं के रूप में, मूल संस्करण में, कोडांतरक 2^27 (134217728) बाइट्स उत्पन्न करने के लिए निर्देशित किया गया है डेटा सेगमेंट में। तो यह ऑब्जेक्ट फ़ाइल का हिस्सा बन जाता है।


लेकिन 129 एमबीएस ( आप -S स्विच gcc -S -fverbose-asm t1.c साथ संकलन के द्वारा विधानसभा उत्पन्न कर सकते हैं)?
 
    1<< n= 2^n (1 left shifted n times). 
=> 1<<25=2^25. 
    now 1 Integer= 4 bytes =2^2 bytes 
=> 2^25 Integers=2^27 bytes=2^7 * 1 M bytes= 128 MBs 

अधिक जानकारी के लिए, देखें:


* नोट 1: यह सख्त मामले में एक object file है।

नोट 2: के रूप में टिप्पणी में कहा, यह भी उल्लेखनीय है कि प्रक्रिया (निष्पादन में कार्यक्रम) का कुल आकार 129Mb हो जाएगा, भले ही निष्पादन 7.3K की है। (कार्यक्रम शुरू होने के बाद स्मृति आवंटित की जाएगी)। आप top कमांड का उपयोग करके अपने प्रोग्राम का मेमोरी उपयोग देख सकते हैं।

नोट 3: यह ज़ोर देने योग्य है कि यह केवल इसलिए है क्योंकि टी वैश्विक है। किसी फ़ंक्शन के लिए स्थानीय डेटा के लिए आवंटन अभी भी स्टैक पर रनटाइम पर होता है। तो यदि t स्थानीय था, तो ऑब्जेक्ट फ़ाइल केवल 7.3K ले ली होगी।

नोट 4: शुरुआती static प्रारंभिक ग्लोबल्स जैसे स्थानीय चर, को data सेगमेंट में भी रखा जाता है। एक static वैश्विक एक ही वैश्विक के रूप में है, सिवाय इसके कि आप चर के दायरे को केवल वर्तमान फ़ाइल तक ही सीमित कर रहे हैं।

+0

भले ही निष्पादन योग्य आकार 7.3K है, प्रक्रिया का आकार अभी भी 130 एमबी होगा। –

+0

@brianbeuning यह काफी स्पष्ट है, लेकिन अभी भी पूर्णता के लिए जोड़ा गया है। – axiom

+0

यह आश्चर्यजनक है, मैं जीसीसी के साथ काफी आकार _many_ बार के ब्रेस-प्रारंभिक सरणी कर रहा हूं और ऐसी कोई चीज़ कभी नहीं देखी। निष्पादन योग्य में केवल गैर-वर्दी डेटा रखा जाता है, बाकी सब कुछ 'मेमसेट' जैसे लूप के साथ शुरू किया जाता है। शायद यह कुछ अजीब अनुकूलन या डीबग झंडे इस्तेमाल किया जा रहा है? – Damon