2008-09-22 13 views
41

सिस्टम मांग करते हैं कि कुछ प्राइमेटिव्स को स्मृति के भीतर कुछ बिंदुओं के साथ गठबंधन किया जाए (बाइट्स में इन्ट्स जो 4 के गुणक हैं, बाइट्स के शॉर्ट्स जो 2 के गुणक हैं)। बेशक, इन्हें पैडिंग में कम से कम जगह बर्बाद करने के लिए अनुकूलित किया जा सकता है।जीसीसी क्यों structs अनुकूलित नहीं करता है?

मेरा सवाल यह है कि जीसीसी स्वचालित रूप से ऐसा क्यों नहीं करता है? क्या अधिक स्पष्ट ह्युरिस्टिक (सबसे बड़ी आकार की आवश्यकता से ऑर्डर वेरिएबल्स को कम से कम) कुछ तरीकों से कमी है? क्या कुछ कोड अपने structs के भौतिक क्रम पर निर्भर है (क्या यह एक अच्छा विचार है)?

मैं केवल इसलिए पूछ रहा हूं क्योंकि जीसीसी कई तरीकों से सुपर अनुकूलित है लेकिन इस में नहीं, और मैं सोच रहा हूं कि कुछ अपेक्षाकृत शांत स्पष्टीकरण होना चाहिए (जिसके लिए मैं अनजान हूं)।

उत्तर

71

जीसीसी एक संरचना के तत्वों को पुन: व्यवस्थित नहीं करता है, क्योंकि यह सी मानक का उल्लंघन करेगा। C99 मानक राज्यों की धारा 6.7.2.1:

एक संरचना वस्तु के भीतर, गैर बिट फ़ील्ड के सदस्यों और इकाइयों जिसमें फाई elds बिट रहते पतों कि वे किस क्रम में घोषित किया गया है में वृद्धि की है ।

+5

हां, लेकिन यह इस तरह से क्यों परिभाषित किया गया था? – nes1983

+1

@ nes1983 प्रोग्रामर संरचना में डेटा के क्रम के रूप में धारणाएं कर सकता है और प्रत्येक भाग प्राप्त करने के लिए मास्किंग का उपयोग कर सकता है। यदि मास्किंग की तुलना में संरचना को फिर से व्यवस्थित किया गया है तो यह गलत होगा। – Evo510

+9

@ ईवो 510: मैं उलझन में हूं। मास्किंग का उपयोग करने के लिए, आपको पैडिंग भी जाननी है, जिसे भाषा द्वारा गारंटी नहीं है। तो, आप मास्क का उपयोग नहीं कर सकते हैं। क्या मैं कुछ भूल रहा हूँ? – nes1983

24

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

+2

इस नेटवर्किंग या फ़ाइल संरचनाओं के साथ कोई संबंध नहीं है। वास्तव में एक बीएमपी संरचना का शीर्षलेख गैर-प्राकृतिक सीमाओं पर गिरने वाले तत्वों के साथ कसकर पैक किया गया है जो संकलक के लिए विदेशी हैं। –

+1

एर, हाँ? आपने प्रश्न का गलत व्याख्या किया है। दूसरे पैराग्राफ को दोबारा पढ़ें, जहां वह स्ट्रक्चर ऑर्डरिंग के बारे में बात करता है। यह पैडिंग से पूरी तरह से अलग है। –

+6

आपका पहला बिंदु बहुत मान्य है। लेकिन मुझे लगता है कि आपका दूसरा नहीं है।विभिन्न कंपाइलरों से संकलित कोड वैसे भी संगत नहीं है। –

1

सी कंपाइलर्स स्वचालित रूप से structs पैक नहीं करते हैं क्योंकि आपके द्वारा उल्लिखित संरेखण के मुद्दों के ठीक है। शब्द सीमाओं पर नहीं पहुंचता है (अधिकांश सीपीयू पर 32-बिट) x86 पर भारी जुर्माना लेता है और आरआईएससी आर्किटेक्चर पर घातक जाल का कारण बनता है।

+1

मैं बफरिंग से छुटकारा पाने के बारे में बात नहीं कर रहा था, मैं सभी लम्बे समय/पॉइंटर्स को अंत तक अंत में डालने के बारे में बात कर रहा हूं, फिर सभी शॉर्ट्स एंड-टू-एंड, फिर सभी पात्र अंत तक, इत्यादि ताकि आप अंत में केवल अंतरिक्ष खो रहे हों। –

+0

अच्छा, यह आधा सच है। सी संकलक उन्हें पैक करने के लिए डिफ़ॉल्ट होगा, वे सिर्फ वास्तुकला की प्राकृतिक शब्द सीमाओं के साथ गठबंधन करते हैं। यही कारण है कि आपको #pragma पैक (0) structs की आवश्यकता है जो पैडिंग जोड़ने से रोकने के लिए पैक किए गए प्रोटोकॉल में वर्ण/शॉर्ट्स का उपयोग कर रहे हैं। –

+0

@ एलेक्स, गलती। आप एक ही मात्रा में जगह बर्बाद करने जा रहे हैं, क्योंकि आपके चरित्र को एक ही राशि को गद्देदार करना होगा। आपको बिल्कुल, अंतरिक्ष या प्रदर्शन के आधार पर लाभ नहीं होगा। –

9

जीसीसी हमारे स्रोत कोड से मशीन कोड बनाने में सबसे अधिक स्मार्ट है; हालांकि, अगर हम अपने structs को फिर से व्यवस्थित करने में हमारे से चालाक थे, तो मैं कंपकंपी करता हूं, क्योंकि यह डेटा है उदा। एक फाइल में लिखा जा सकता है। एक स्ट्रक्चर जो 4 वर्णों से शुरू होता है और उसके बाद 4 बाइट इंटीजर बेकार होगा यदि किसी अन्य सिस्टम पर पढ़ा जाए जहां जीसीसी ने फैसला किया कि उसे संरचना सदस्यों को फिर से व्यवस्थित करना चाहिए।

+1

संरेखण (जिसे अनुमति है) के कारण किसी भी फाइल को सीधे पढ़ना/लिखना स्ट्रक्चर नहीं है, यह देखें [यह] (https://stackoverflow.com/questions/5397447/struct-padding-in-c) SO जवाब। – forumulator

6

जीसीसी एसवीएन में एक संरचना पुनर्गठन अनुकूलन (-फापा-स्ट्रक्चर-रीर्ग) है, लेकिन इसके लिए पूरे कार्यक्रम विश्लेषण की आवश्यकता है और इस समय बहुत शक्तिशाली नहीं है।

1

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

+0

मेरा मानना ​​है कि लिनक्स कर्नेल इसे लिंक्ड सूचियों के लिए करता है। –