2012-09-04 14 views
6

私はCとアセンブリ(intelx8086)のlenguageで作業しようとしています。私も一つのクラス私の友人を使用していEnumはどのようにCにメモリを割り当てますか?

は(AKA国会でそれを破壊する/それを構築する)私は、このクラスのビット単位で仕事をしたい

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

を持っていることを私に与えました。私の質問は、どのくらいのメモリが "enum"にかかるのでしょうか?

+1

Cでは、 'int'と同じです。 C++ 0xでは、基底型に基づいています。 – DCoder

+0

[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)には、あなたの仕事に関連するいくつかの情報があります。 – 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)に等しく、タイプintC11§6.7.2.2列挙指定子)が定数として宣言されているが、それは必要ありません!

ところで、サイズをビット数にしたい場合は、CHAR_BIT定数(<limits.h>で定義)を使用してください。これは、1バイトに何ビットがあるかを示しています)。

/* 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より大きいと言います。例えば、DSPでは' CHAR_BIT'は16に等しいことがよくあります。 – md5

+2

@Dirk:CHAR_BITが8になるという保証はありません。歴史的に、バイトは6,7、 8ビット。現代の組込みシステムは、異なるサイズのchar(例えば、16ビット)を有することがある。私たちはまた、どのアーキテクチャが10年以上のように見えるかも知らないので、安全に失敗するために静的なアサーションを使用するのは最善ではありません。 – sfstewman

6

それはenumは、典型的には、intと同じ大きさをとり、コンパイラにコンパイラによって異なるかもしれないが。ただし、必ず使用することができます。sizeof(data_10_type);

+0

+1のサイズ。それは知っている唯一の安全な、移植可能な方法です。 – sfstewman

+0

これは、1つのアーキテクチャー上のあるコンパイラーの特定のバージョンのサイズを示します。それは未来を保証するものではありません。 – NovaDenizen

+0

@NovaDenizenあなたが一度それを印刷し、それを永遠に使用する場合のみ。それを変数に格納し、それを使って割り当てを行う方がよい。 – Greyson

関連する問題