2012-09-04 18 views
6

Estoy tratando de trabajar con lenguaje C y montaje (intelx8086).¿Cómo asigna Enum memoria en C?

También estoy usando una clase un amigo mío me dio que tiene un

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

quiero trabajar con esta clase de bit a bit (También conocido como construirlo/destruirlo en la Asamblea). Mi pregunta es, ¿cuánta memoria toma "enum"?

+1

En C, lo mismo que 'int'. En C++ 0x, puede estar más o menos basado en el tipo de base. – DCoder

+0

posible duplicado de [¿Cuál es el tamaño de una enumeración en 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) tiene información relevante para su tarea. – NovaDenizen

Respuesta

1

Una enumeración realmente no ocupa ningún tipo de memoria; el compilador lo entiende y los números correctos se usan durante la compilación. Es un int, cuyo tamaño depende de tu sistema.

2

¿Por qué no lo imprimes?

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

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

Los identificadores en una lista empadronador se declaran como constantes que tienen el tipo int (C11 §6.7.2.2 especificadores de enumeración), por lo sizeof(data_10_type) a menudo es igual a sizeof(int), pero no es necesario!

BTW, si desea tener un tamaño en bits, simplemente use la constante CHAR_BIT (definida en <limits.h>), que indica cuántos bits hay en un solo 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

¿En qué casos difiere CHAR_BIT de 8? – Dirk

+3

La norma dice 'CHAR_BIT' es mayor que 8. Por ejemplo, en los DSP,' CHAR_BIT' es a menudo igual a 16. – md5

+2

@Dirk: no hay garantía de que CHAR_BIT sea 8. Históricamente, los bytes han sido 6, 7 y 8 bits. Los sistemas integrados modernos pueden tener diferentes tamaños de char (16 bits, por ejemplo). Tampoco sabemos qué arquitecturas se verán a más de 10 años en el camino, por lo que es mejor no asumir (o al menos usar aserciones estáticas para fallar de forma segura). – sfstewman

6

Aunque puede variar de compilador para compilador, enum típicamente tiene el mismo tamaño que un int. Sin embargo, para estar seguro, siempre puede usar sizeof(data_10_type);

+0

+1 para sizeof. Es la única forma segura y portátil de saberlo. – sfstewman

+0

Esto le dirá el tamaño en una versión particular de un compilador en una arquitectura. No es a prueba de futuro. – NovaDenizen

+0

@NovaDenizen Solo si lo imprime una vez y lo usa para siempre. Es mejor almacenarlo en una variable y usarlo para hacer la asignación. – Greyson