2012-09-04 11 views
6

Ich versuche mit C und Assembly (Intelx8086) Sprache zu arbeiten.Wie reserviert Enum Speicher auf C?

Ich bin auch eine Klasse ein Freund von mir mit mir, das eine

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

hat Ich möchte mit dieser Klasse bitweise (AKA konstruieren sie/es zerstören auf Assembly) arbeiten. Meine Frage ist, wie viel Speicher nimmt "enum" ein?

+1

In C verwenden, wie ein 'int'. In C++ 0x kann es mehr oder weniger auf dem Basistyp basieren. – DCoder

+0

mögliche Duplikate von [Was ist die Größe eines Enums 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) enthält einige Informationen, die für Ihre Aufgabe relevant sind. – NovaDenizen

Antwort

1

Ein Enum nimmt überhaupt keine Erinnerung an; Es wird vom Compiler verstanden und die richtigen Zahlen werden während der Kompilierung verwendet. Es ist ein Int, dessen Größe von Ihrem System abhängt.

2

Warum drucken Sie es nicht?

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

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

Die Kennungen in einer Aufzählungsliste als Konstanten deklariert, die Art haben int (C11 §6.7.2.2 Enumeration Bezeich), so sizeof(data_10_type)-sizeof(int) oft gleich ist, aber es ist nicht notwendig! Wenn Sie eine Größe in Bits haben möchten, verwenden Sie einfach die Konstante CHAR_BIT (definiert in <limits.h>), die angibt, wie viele Bits in einem einzelnen Byte enthalten sind.

/* 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 welchen Fällen unterscheidet sich CHAR_BIT von 8? – Dirk

+3

Der Standard sagt 'CHAR_BIT' ist größer als 8. Zum Beispiel ist' CHAR_BIT' auf DSPs oft gleich 16. – md5

+2

@Dirk: Es gibt keine Garantie, dass CHAR_BIT 8 ist. Historisch gesehen waren Bytes 6, 7 und 8 Bits. Moderne eingebettete Systeme können unterschiedliche Größen von Zeichen haben (beispielsweise 16 Bits). Wir wissen auch nicht, wie Architekturen in mehr als zehn Jahren aussehen werden. Daher ist es am besten, nicht davon auszugehen (oder zumindest statische Behauptungen zu verwenden, um sicher zu versagen). – sfstewman

6

Obwohl es vom Compiler Compiler variieren kann, nimmt enum typischerweise die gleiche Größe wie ein int. Um sicher zu sein, können Sie jedoch immer sizeof(data_10_type);

+0

+1 für sizeof. Es ist die einzige sichere, tragbare Art zu wissen. – sfstewman

+0

Dies wird Ihnen die Größe einer bestimmten Version eines Compilers für eine Architektur mitteilen. Es ist nicht zukunftssicher. – NovaDenizen

+0

@NovaDenizen Nur wenn Sie es einmal ausdrucken und für immer verwenden. Besser, es in einer Variablen zu speichern und diese für die Zuweisung zu verwenden. – Greyson