2010-01-18 6 views
12

पृष्ठभूमि: कंपाइलर अपने सदस्यों को बेहतर संरेखित करने के लिए एक स्ट्रिंग में पैडिंग डाल सकता है। इसके परिणाम स्वरूप संरचना के आकार के सदस्यों के आकार की तुलना में बड़ा होगा। संरचना के सदस्यों को पुन: व्यवस्थित करना ताकि वे बेहतर तरीके से पैक कर सकें ताकि संकलक को इस तरीके से पैड की आवश्यकता को हटा दिया जा सके और संरचना को छोटी बचत स्मृति बना सके। मुझे उन स्मृति बचत को प्राप्त करने की ज़रूरत है।उन सभी structs को कैसे ढूंढें जिन्हें उनके सदस्यों के क्रम को बदलकर छोटा बनाया जा सकता है

फ़ॉलबैक विकल्प हाथ से प्रत्येक संरचना की जांच करना है। मैं एक स्वचालित दृष्टिकोण की तलाश में हूं जो प्रयास को कम कर सकता है।

भले ही यह केवल हाथों द्वारा जांच की जाने वाली structs की संख्या को कम कर देता है जो मदद करेगा।

तो उदाहरण के लिए एक प्रक्रिया/उपकरण/आदि जो सभी सदस्यों को सूचीबद्ध करता है जो उनके सदस्यों के आकार की तुलना में बड़े होते हैं, जबकि सही नहीं होते हैं, फिर भी सहायक होंगे क्योंकि यह उन लोगों को सीमित करेगा जिन्हें मैन्युअल रूप से चेक करने की आवश्यकता है ।

क्या किसी को भी ऐसा करने वाले किसी भी उपकरण के बारे में पता है या कोई भी मदद कर सकता है जो किसी भी दृष्टिकोण का सुझाव दे सकता है।

पेज। मुझे इसे एक एम्बेडेड सी कोडबेस पर करने की ज़रूरत है जिसमें कोड की 1 मिलियन से अधिक लाइनें हों।

+1

अधिकांश कंप्यूटर्स के पास स्ट्रक्चर को पैक करने का विकल्प होता है - एमएसवीसी ++ पर यह '/ zp' है, जीसीसी पर यह' -फैक-स्ट्रक्चर 'है। ध्यान रखें कि (1) यह अन्य कोड के साथ एबीआई संगतता को तोड़ देगा और (2) अधिकांश सीपीयू अनियंत्रित डेटा को धीरे-धीरे एक्सेस करेंगे (या कुछ आर्किटेक्चर पर नहीं)। –

उत्तर

10

pahole इस विशिष्ट उद्देश्य के लिए एक उपयोगिता लिखा गया है। यह आपकी संकलित ऑब्जेक्ट फ़ाइलों का विश्लेषण करेगा (डिबगिंग सक्षम के साथ संकलित), और आपको संरचना छेद दिखाता है।

+0

वापस आया और आपको ऊपर उठाया, इसे थोड़ा सा इस्तेमाल करने के लिए मुझे कहना है कि पैहोल अद्भुत है –

1

आप एक प्रोग्राम लिख सकते हैं जो बदले में संरचना में खेतों के हर क्रमपरिवर्तन के लिए एक छोटा सी प्रोग्राम लिखता है, और जब आउटपुट प्रोग्राम संकलित होता है और उसके प्रिंट को संरचना आकार से बाहर चलाता है। यदि क्षेत्र की संख्या 10 या उससे भी अधिक हो जाती है तो यह अव्यवहारिक हो जाएगा।

+0

यह बहुत अधिक समझ में नहीं आता है। आम तौर पर, फ़ील्ड को ऑर्डर करना सबसे बड़ा-से-कम इष्टतम पैडिंग उत्पन्न करता है। –

+1

@Anon यह सच रहता है अगर कुछ प्रकार के आकार दो की शक्ति नहीं हैं, उदाहरण के लिए 10-बाइट विस्तारित युगल या यहां तक ​​कि 'char t [5] '? –

+0

'char' की एक सरणी को अन्य 'char' के साथ आदेश दिया जाना चाहिए - शायद यह कहना अधिक सटीक होगा कि फ़ील्ड संरेखण आवश्यकताओं द्वारा आदेश दिया जाना चाहिए। –

1

CIL ओकैम में लिखा गया एक मजबूत सी पार्सर है जो structs के पैडिंग को समझता है। यह एक पहचान सी कार्यक्रम के साथ आता है। स्ट्रक्चर पैडिंग प्लेटफॉर्म-विशिष्ट है, मुझे संदेह नहीं है कि आप इसे जानते हैं, लेकिन आप इसे अपने प्रश्न में स्पष्ट कर सकते थे। सीआईएल के साथ पैक किया गया पहचान कार्यक्रम प्रकारों के आकार का पता लगाता है, और एल्गोरिदम कि सीआईएल मानता है कि structs के पैडिंग के लिए उपयोग किया जाता है यह है कि एन-वें फ़ील्ड ऑफसेट की गणना गोलाकार ((एन -1) -थ फ़ील्ड ऑफसेट + (एन -1) -थ फ़ील्ड का आकार) निकटतम एकाधिक (एन-वें क्षेत्र के संरेखण) के लिए।

सीआईएल से शुरू होने वाले टूल को बनाने के लिए ओकैमल की 200 से कम लाइनें होंगी। लेकिन अभी तक बेहतर समाधान हो सकते हैं।

9

जीसीसी की -पैडड चेतावनी विकल्प का उपयोग आपको यह बताने के लिए किया जा सकता है कि जब संरचना को गद्दी दी जा रही है। यह आपको तब नहीं बताएगा जब संरचना को छोटा बनाया जा सकता है, लेकिन यह काम को कम करने में मदद कर सकता है।

+0

मुझे लगता है कि वह विकल्प पहले से ही नहीं मिला है। –

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

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