2012-09-04 11 views
6

मैं सी और असेंबली (intelx8086) लैंडेज के साथ काम करने की कोशिश कर रहा हूं।एनम सी पर मेमोरी आवंटित कैसे करता है?

मैं भी एक वर्ग मेरा एक दोस्त का उपयोग कर रहा मुझे दिया है कि एक

typedef enum data_10 {a=0,b=7,c=10,} data_10_type; 

मैं इस वर्ग बिटवाइज़ साथ काम करना चाहते (उर्फ यह निर्माण/विधानसभा पर इसे नष्ट)। मेरा सवाल यह है कि, "enum" कितनी मेमोरी लेता है?

+1

सी में, 'int' के समान उपयोग कर सकते हैं। सी ++ 0x में, यह बेस प्रकार के आधार पर कम या ज्यादा हो सकता है। – DCoder

+0

संभावित डुप्लिकेट [सी में enum का आकार क्या है?] (Http://stackoverflow.com/questions/366017/what-is-the-size-of-an-enum-in-c) – DCoder

+0

[विकिपीडिया ] (http://en.wikipedia.org/wiki/Data_structure_alignment#Typical_alignment_of_C_structs_on_x86) में आपके कार्य के लिए प्रासंगिक कुछ जानकारी है। – NovaDenizen

उत्तर

1

एक enum वास्तव में कोई स्मृति नहीं लेता है; यह संकलक द्वारा समझा जाता है और संकलन के दौरान सही संख्याओं का उपयोग किया जाता है। यह एक int है, जिसका आकार आपके सिस्टम पर निर्भर है।

2

आप इसे प्रिंट क्यों नहीं करते?

/* C99 */ 
#include <stdio.h> 

typedef enum { a = 0, b = 7, c = 10 } data_10_type; 
printf("%zu\n", sizeof(data_10_type)); 

एक प्रगणक सूची में पहचानकर्ता तो sizeof(data_10_type) अक्सर sizeof(int) के बराबर है, स्थिरांक प्रकार int (C11 §6.7.2.2 गणन विनिर्देशक) है कि के रूप में घोषित किया गया है, लेकिन यह आवश्यक नहीं है!

बीटीडब्ल्यू, यदि आप बिट्स में आकार रखना चाहते हैं, तो बस CHAR_BIT स्थिर (<limits.h> में परिभाषित) का उपयोग करें, जो इंगित करता है कि एक बाइट में कितने बिट्स हैं)।

/* C99 */ 
#include <limits.h> 
#include <stdio.h> 

typedef enum { a = 0, b = 7, c = 10 } data_10_type; 
printf("%zu\n", sizeof(data_10_type) * CHAR_BIT); 
+0

किस मामले में CHAR_BIT 8 से भिन्न है? – Dirk

+3

मानक कहता है कि 'CHAR_BIT' 8 से अधिक है। उदाहरण के लिए, डीएसपी पर,' CHAR_BIT' अक्सर 16 के बराबर होता है। – md5

+2

@ डिर्क: कोई गारंटी नहीं है कि CHAR_BIT 8 होगा। ऐतिहासिक रूप से बाइट 6, 7, और 8 बिट्स आधुनिक एम्बेडेड सिस्टम में चार प्रकार के चार हो सकते हैं (उदाहरण के लिए 16-बिट्स)। हम यह भी नहीं जानते कि आर्किटेक्चर सड़क के नीचे 10+ साल की तरह दिखेंगे, इसलिए यह मानना ​​सर्वोत्तम नहीं है (या कम से कम स्थिर रूप से असफल होने के लिए स्थिर दावों का उपयोग करें)। – sfstewman

6

हालांकि यह संकलक से संकलक करने के लिए भिन्न हो सकते हैं, enum आम तौर पर एक int के रूप में एक ही आकार लेता है। यह सुनिश्चित करने के लिए, हालांकि, आप हमेशा sizeof(data_10_type);

+0

+1। यह जानने का एकमात्र सुरक्षित, पोर्टेबल तरीका है। – sfstewman

+0

यह आपको एक आर्किटेक्चर पर एक कंपाइलर के एक विशेष संस्करण पर आकार बताएगा। यह भविष्य के सबूत नहीं है। – NovaDenizen

+0

@ नोवाडेनज़ेन केवल तभी जब आप इसे एक बार प्रिंट करते हैं और हमेशा के लिए इसका उपयोग करते हैं। इसे एक चर में स्टोर करने के लिए बेहतर है और आवंटन करने के लिए इसका उपयोग करें। – Greyson

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