2008-09-27 17 views

उत्तर

0

मुझे लगता है कि आप संरचना का मतलब है और सख्त नहीं, लेकिन 32-बिट सिस्टम पर यह या तो 5 या 8 बाइट्स होगा, इस पर निर्भर करता है कि संकलक संरचना को पैडिंग कर रहा है या नहीं।

0

मुझे संदेह है कि आपको 'स्ट्र' के बजाय 'स्ट्रक्चर', 'सख्त' और 'char' का अर्थ है।

आकार कार्यान्वयन पर निर्भर करेगा। अधिकांश 32-बिट सिस्टम पर, यह पॉइंटर के लिए शायद 5 - 4 बाइट होगा, एक चार के लिए। मुझे विश्वास नहीं है कि संरेखण यहां खेलेंगे। यदि आपने 'सी' और 'बी' को बदल दिया है, तो आकार 8 बाइट तक बढ़ सकता है।

ठीक है, मैं इसे बाहर की कोशिश की (छ ++ 4.2.3, जी विकल्प के साथ) और मैं 8.

+1

संरेखण * शायद * खेल में आ सकता है। – jop

1

यह आपके वास्तुकला और यह कैसे बुनियादी डेटा प्रकार व्यवहार करता है पर निर्भर करती है मिलता है। यह इस बात पर भी निर्भर करेगा कि सिस्टम को प्राकृतिक संरेखण की आवश्यकता है या नहीं।

2

सटीक मूल्य आकार (ए) है।
आप जोखिम भी ले सकते हैं और मान सकते हैं कि यह इस मामले में 2 से कम नहीं है और 16 से अधिक नहीं है।

+0

हालांकि सिद्धांत में कोई ऊपरी सीमा नहीं है क्योंकि पॉइंटर्स के कार्यान्वयन और आकार संकलक विशिष्ट हैं बशर्ते वे मानक के अनुसार व्यवहार करें। – Skizz

9

कुछ अन्य उत्तरों के विपरीत, अधिकांश प्रणालियों पर, किसी भी अनुपस्थिति में, प्रगमा या कंपाइलर विकल्प, संरचना का आकार कम से कम 6 बाइट होगा और अधिकांश 32-बिट सिस्टम, 8 बाइट्स पर होगा। 64-बिट सिस्टम के लिए, आकार आसानी से 16 बाइट्स हो सकता है। संरेखण खेल में आता है; हमेशा। एक ही संरचना का आकार ऐसा होना चाहिए कि उन आकारों की एक सरणी आवंटित की जा सके और सरणी के अलग-अलग सदस्यों को प्रश्न में प्रोसेसर के लिए पर्याप्त रूप से गठबंधन किया गया हो। नतीजतन, अगर संरचना का आकार 5 था, जैसा कि अन्य ने अनुमान लगाया था, तो दो ऐसी संरचनाओं की एक सरणी 10 बाइट लंबी होगी, और दूसरे सरणी सदस्य में चार सूचक एक अजीब बाइट पर गठबंधन किया जाएगा, जो अधिकतर होगा प्रोसेसर) प्रदर्शन में एक बड़ी बाधा का कारण बनता है।

+0

और पुराने 68k मैक पर, दुर्घटना! –

+0

कारण मैंने अनुमान लगाया कि संरेखण का कोई प्रभाव नहीं होगा कि दोनों सदस्यों को उनके बीच पैडिंग के बिना ठीक से गठबंधन किया जाएगा। मुझे अंत में पैडिंग के लिए आकार के आकार की उम्मीद नहीं थी। मेरी परिकल्पना को प्रयोगात्मक रूप से अस्वीकार कर दिया गया है, जैसा कि मैंने अपने उत्तर में एक संपादन में उल्लेख किया था। –

32
#include <stdio.h> 

typedef struct { char* c; char b; } a; 

int main() 
{ 
    printf("sizeof(a) == %d", sizeof(a)); 
} 

मुझे 32-बिट मशीन पर "sizeof (a) == 8" मिलता है। संरचना का कुल आकार पैकिंग पर निर्भर करेगा: मेरे मामले में, डिफ़ॉल्ट पैकिंग 4 है, इसलिए 'सी' 4 बाइट्स लेता है, 'बी' एक बाइट लेता है, जिससे 3 पैडिंग बाइट्स को अगले 4 में लाया जाता है : 8. आप इस पैकिंग को बदलने के लिए चाहते हैं, तो सबसे compilers यह बदलने के लिए एक रास्ता है, उदाहरण के लिए, MSVC पर:

#pragma pack(1) 
typedef struct { char* c; char b; } a; 

देता sizeof (एक) == 5. यदि आप ऐसा करते हैं, करने के लिए सावधान रहना होगा किसी लाइब्रेरी हेडर से पहले पैकिंग रीसेट करें!

+3

यह सुनिश्चित करने के लिए कि यह काम करता है: printf ("sizeof (a) ==% d", (int) sizeof (ए)); ' –

+1

@ थॉमसपैड्रॉन-मैककार्थी रादर 'printf ("% zu ", sizeof (a)) ' –

+0

@ एच 2CO3: हाँ, यह भी एक आधुनिक पर्याप्त सी –

0

संरचना का आकार 32 बिट सिस्टम पर 8 बाइट्स होना चाहिए, ताकि संरचना का आकार 2 से अधिक हो जाए। यह संरचनाओं की एक सरणी घोषित होने पर व्यक्तिगत बाइट सीमाओं पर उपलब्ध व्यक्तिगत संरचनाएं बनाती है। यह अंत में 3 बाइट्स के साथ संरचना पैडिंग द्वारा हासिल किया जाता है।

यदि संरचना के पास चार के बाद घोषित सूचक था, तो यह आकार में 8 बाइट्स होगा लेकिन 3 बाइट पैडिंग को 4 बाइट पर पॉइंटर (जो 4 बाइट तत्व है) को रखने के लिए जोड़ा गया होगा पता सीमा

अंगूठे का नियम यह है कि तत्व ऑफसेट पर होना चाहिए जो उनके बाइट आकार के एकाधिक हैं और संरचना स्वयं आकार के होना चाहिए जो 2 का एक बहु है।

+0

यह अपेक्षाकृत असामान्य है, लेकिन केवल चार सरणी वाली संरचना में एक अजीब आकार हो सकता है: 'असामान्य संरचना {char a [3]; चार बी [4]; }; 'किसी भी दुष्प्रभाव के बिना 7 का आकार हो सकता है। एक कंपाइलर अभी भी इसे 8 बाइट्स तक पैड कर सकता है, लेकिन ऐसा करने की कोई स्पष्ट आवश्यकता नहीं है। –

4

यदि आप इसे मैन्युअल रूप से गिनना चाहते हैं, तो संरचना का आकार संरेखण के लिए लेखांकन के बाद अपने प्रत्येक डेटा सदस्यों का आकार है। एक संरचना के लिए कोई जादू ओवरहेड बाइट्स नहीं है।

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