2012-03-28 10 views
6

मैं 64-बिट प्लेटफ़ॉर्म पर uint32_t प्रकारों के संरेखण के बारे में उत्सुक हूं। कल्पना का कहना है कि uint32_t बिल्कुल दिया bitwidth, वास्तव में यह हो रहा है जो होना चाहिए:uint32_t संरेखण?

> printf("sizeof(uint32_t): %zd\n", sizeof(uint32_t)); 
sizeof(uint32_t): 4 

लेकिन तब मैं एक struct है:

typedef struct A { 
    uint32_t a; 
    uint32_t b; 
} A; 

लेकिन, आश्चर्य की बात:

> printf("sizeof(A): %zd\n", sizeof(A)); 
sizeof(A): 16 

क्या Uint32_t किसी कारण से 8-बाइट गठबंधन किया जा रहा है? क्या यह वास्तव में नीचे 8-बाइट प्रकार है?

+1

कंपाइलर क्या है और वास्तुकला क्या है? – ouah

+1

x86-64 –

+0

पर gcc 4.4.5 ध्यान दें कि सरणी के तरीके के कारण, 'uint32_t' * की संरेखण आवश्यकता * आकार (uint32_t)' से कम या बराबर होनी चाहिए। 'UintN_t' प्रकारों में कोई पैडिंग नहीं होने की आवश्यकता के कारण,' sizeof (uint32_t) * CHAR_BIT == 32'। कुछ और सी 99 के अनुरूप नहीं है। हालांकि, आपके 'स्ट्रक्चर ए' के ​​संरेखण को सी 99 द्वारा किसी भी सदस्य का सबसे बड़ा संरेखण करने की अनुमति है। –

उत्तर

6

यह पूरी तरह से आपके कंपाइलर और वास्तुकला पर निर्भर है। आपके मामले में ऐसा लगता है कि फ़ील्ड वास्तव में प्रदर्शन के कारणों के लिए 8-बाइट-गठबंधन हैं।

2

मेरा अनुमान है कि डिफ़ॉल्ट रूप से 64 बिट आर्किटेक्चर पर 64 बिट आर्किटेक्चर के समान 64 बिट सीमाओं के साथ गठबंधन किया जाएगा, सब कुछ 4 बाइट्स के साथ गठबंधन किया गया है। आप पैडिंग से छुटकारा पाने के लिए पैकिंग प्रगमा निर्देश निर्दिष्ट कर सकते हैं। उदाहरण के लिए

#pragma pack(0) 

जीसीसी में।

+0

आश्चर्यजनक रूप से पर्याप्त है, अगर मैं पैक (1) करता हूं, तो उपरोक्त दो-तत्व संरचना केस अभी भी मुझे 16 देता है, लेकिन अगर मैं इसे और अधिक Uint32_t जोड़ता हूं, तो मुझे 20 मिलते हैं ... परेशान –