2012-09-04 14 views
6

Sto provando a lavorare con C e Assembly (intelx8086) lenguage.In che modo Enum alloca la memoria su C?

Sto anche utilizzando una classe un mio amico mi ha dato che ha un

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

voglio lavorare con questa classe bit per bit (AKA costruirlo/distruggerla su Assembly). La mia domanda è: quanta memoria occupa "enum"?

+1

In C, come un 'int'. In C++ 0x, può essere più o meno basato sul tipo di base. – DCoder

+0

possibile duplicato di [Qual è la dimensione di un enum in C?] (Http://stackoverflow.com/questions/366017/what-is-the-size-of-an-enum-in-c) – DCoder

+0

[Wikipedia ] (http://en.wikipedia.org/wiki/Data_structure_alignment#Typical_alignment_of_C_structs_on_x86) contiene alcune informazioni rilevanti per il tuo compito. – NovaDenizen

risposta

1

Un enum in realtà non prende alcun ricordo; è compreso dal compilatore e vengono utilizzati i numeri corretti durante la compilazione. È un int, le cui dimensioni dipendono dal tuo sistema.

2

Perché non lo stampa?

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

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

Gli identificatori in un elenco enumeratore sono dichiarati come costanti che hanno tipo int (C11 §6.7.2.2 prescrittori Enumeration), in modo da sizeof(data_10_type) spesso è pari a sizeof(int), ma non è necessario!

BTW, se si desidera avere una dimensione in bit, utilizzare solo la costante CHAR_BIT (definita in <limits.h>), che indica quanti bit ci sono in un singolo byte).

/* 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

in quali casi CHAR_BIT differisce da 8? – Dirk

+3

Lo standard dice 'CHAR_BIT' è maggiore di 8. Ad esempio, su DSPs,' CHAR_BIT' è spesso uguale a 16. – md5

+2

@Dirk: non ci sono garanzie che CHAR_BIT sarà 8. Storicamente, i byte sono stati 6, 7, e 8 bit. I moderni sistemi embedded possono avere dimensioni diverse di char (16 bit, ad esempio). Inoltre, non sappiamo quali saranno le architetture a più di 10 anni di distanza, quindi è meglio non assumere (o almeno usare asserzioni statiche per fallire in sicurezza). – sfstewman

6

Anche se può variare da compilatore a compilatore, enum prende tipicamente la stessa dimensione come int. Per sicurezza, però, puoi sempre usare sizeof(data_10_type);

+0

+1 per sizeof. È l'unico modo sicuro e portatile per sapere. – sfstewman

+0

Questo ti dirà la dimensione su una particolare versione di un compilatore su un'architettura. Non è a prova di futuro. – NovaDenizen

+0

@NovaDenizen Solo se lo stampi una volta e lo usi per sempre. Meglio memorizzarlo in una variabile e usarlo per fare l'allocazione. – Greyson

Problemi correlati