a
とb
はどちらもint
タイプですsigned int
。長さは32 ビット、つまり 4 バイトです。
しかし、列挙型ENUM
はそれほど必要ではありません。
0000000000000000000000000000000 equals a
0000000000000000000000000000001 equals b
そこで作成者は、長さ8 ビット、最小長 1 バイトのaENUM
よりも短くすることを考えました。int
bitfield
00000000 or 00000001
char
最初から 1 バイトの長さの型を取ることもできたのですが。
一部のコンパイラでは、機能を有効にして、列挙型が int よりも小さくなるようにすることができます。GCC のオプション --short-enums を使用すると、すべての値に適合する最小の型が使用されます。
これは、ビットフィールドを使用してメモリを節約する方法の例です。someBits
構造体が構造体よりも小さいことがわかりますtwoInts
。
#include "stdio.h"
struct oneInt {
int x;
};
struct twoInts {
int x;
int y;
};
struct someBits {
int x:2; // 2 Bits
int y:6; // 6 Bits
};
int main (int argc, char** argv) {
printf("type int = %lu Bytes\n", sizeof(int));
printf("oneInt = %lu Bytes\n", sizeof(struct oneInt));
printf("twoInts = %lu Bytes\n", sizeof(struct twoInts));
printf("someBits = %lu Bytes\n", sizeof(struct someBits));
return 0;
}
出力:
type int = 4 Bytes
oneInt = 4 Bytes
twoInts = 8 Bytes
someBits = 4 Bytes