2012-04-01 14 views
8

में पैकिंग या पैडिंग डेटा मैं जीएनयू जीसीसी कंपाइलर के साथ कोड :: ब्लॉक आईडीई का उपयोग कर रहा हूं।सी/सी ++: एक संरचना

struct test 
{ 
    char a; 
    char e; 
    char f; 
    char b; 
    char d; 
}; 

sizeof(test) रिटर्न 5। , Why isn't sizeof for a struct equal to the sum of sizeof of each member?

कैसे आ पिछले char के बाद कोई पैडिंग है ताकि sizeof(test) रिटर्न 6 या 8:

मैं इस सवाल का जवाब पढ़ा है? short और int इत्यादि जोड़ने के बाद मैं एक और सवाल पूछ सकता हूं, लेकिन मुझे लगता है कि यह सवाल अभी के लिए अच्छा है। प्रोसेसर के साथ काम करने के लिए पैडिंग करना आसान नहीं होगा?

उत्तर

10

char का संरेखण केवल 1 है, इसलिए बड़ी संरेखण आवश्यकता को पूरा करने के लिए संरचना को गद्दी के लिए कोई आवश्यकता नहीं है।

+0

ठीक है, तो मान लें कि मेरा शब्द आकार 4 बाइट है। मान लें कि मेरे पास एक सरणी 'टेस्ट स्टफ [1000] 'है। मेरा प्रोसेसर व्यक्तिगत 'टेस्ट' जैसे 'चार-चार-चार-चार चार-पैड-पैड-पैड' पढ़ता है। स्मृति में सरणी को इस तरह स्वरूपित करने की आवश्यकता नहीं है? – newprogrammer

+0

@ न्यूप्रोग्रामर संख्या। यह संरचना के सदस्यों के सरणी के सदस्यों के बीच पैडिंग के बिना 5000 बाइट होगा। – asaelr

+0

@ न्यूप्रोग्रामर: आपकी संरचना में कोई "शब्द" नहीं है, इसलिए "शब्द" के लिए आवश्यक संरेखण अप्रासंगिक है। –

1

चूंकि आप समय पर एक सदस्य के साथ काम करते हैं, या संरचना के पते को पास करते हैं, तो कंपाइलर अपने सदस्यों के लिए आवश्यक संरेखण से अधिक संपूर्ण संरचना को संरेखित करने की परवाह नहीं करता है। इसका मतलब है कि यदि आप इस संरचना को आवंटित करते हैं (या इसे कार्य करने के लिए पास करते हैं), प्रोसेसर को इसे सदस्य-दर-सदस्य पढ़ना होगा। (और यह थोड़ा धीरे धीरे होगा)।

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