私はCとアセンブリ(intelx8086)のlenguageで作業しようとしています。私も一つのクラス私の友人を使用していEnumはどのようにCにメモリを割り当てますか?
は(AKA国会でそれを破壊する/それを構築する)私は、このクラスのビット単位で仕事をしたい
typedef enum data_10 {a=0,b=7,c=10,} data_10_type;
を持っていることを私に与えました。私の質問は、どのくらいのメモリが "enum"にかかるのでしょうか?
私はCとアセンブリ(intelx8086)のlenguageで作業しようとしています。私も一つのクラス私の友人を使用していEnumはどのようにCにメモリを割り当てますか?
は(AKA国会でそれを破壊する/それを構築する)私は、このクラスのビット単位で仕事をしたい
typedef enum data_10 {a=0,b=7,c=10,} data_10_type;
を持っていることを私に与えました。私の質問は、どのくらいのメモリが "enum"にかかるのでしょうか?
enumは実際にはメモリをまったく使用しません。それはコンパイラによって理解されており、コンパイル時に正しい番号が使用されます。 int型です。サイズはシステムによって異なります。
なぜ印刷しないのですか?列挙子リストで
/* 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>
で定義)を使用してください。これは、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);
それはenum
は、典型的には、int
と同じ大きさをとり、コンパイラにコンパイラによって異なるかもしれないが。ただし、必ず使用することができます。sizeof(data_10_type);
+1のサイズ。それは知っている唯一の安全な、移植可能な方法です。 – sfstewman
これは、1つのアーキテクチャー上のあるコンパイラーの特定のバージョンのサイズを示します。それは未来を保証するものではありません。 – NovaDenizen
@NovaDenizenあなたが一度それを印刷し、それを永遠に使用する場合のみ。それを変数に格納し、それを使って割り当てを行う方がよい。 – Greyson
Cでは、 'int'と同じです。 C++ 0xでは、基底型に基づいています。 – DCoder
[Cの列挙型のサイズは?](http://stackoverflow.com/questions/366017/what-is-the-size-of-an-enum-in-c) – DCoder
[Wikipedia ](http://en.wikipedia.org/wiki/Data_structure_alignment#Typical_alignment_of_C_structs_on_x86)には、あなたの仕事に関連するいくつかの情報があります。 – NovaDenizen