さて、私はビットフィールドを作成しました
typedef struct
{
unsigned bit : 1;
}BIT;
sizeof 演算子は 4 を返します...したがって、構造体は実際には少しではなく、むしろ 32 であると言われています。それはすべてシステムに依存していますか?(私の本では、char は 1 バイトしかないと言っていますが、私にとって sizeof(char) は 4 を返します...)
N1570 :
6.7.2.1 構造体と共用体の指定子
...
11 実装では、ビットフィールドを保持するのに十分な大きさのアドレス指定可能なストレージ ユニットを割り当てることができます。十分なスペースが残っている場合、構造内の別のビットフィールドの直後に続くビットフィールドは、同じユニットの隣接するビットにパックされます。十分なスペースが残っていない場合、収まらないビットフィールドを次のユニットに配置するか、隣接するユニットとオーバーラップするかは実装定義です。ユニット内のビットフィールドの割り当て順序 (上位から下位、または下位から上位) は実装定義です。アドレス可能なストレージ ユニットのアラインメントは指定されていません。
unsigned int
あなたの実装では、ビット フィールドを格納するために32 ビットが割り当てられているようです。コンパイラのドキュメントを調べて、ビットフィールドに小さい型を強制的に使用する方法があるかどうかを確認してください。
sizeof(char)
を返すことは規格で保証されてい1
ます。
構造に対してBIT
: 1 バイト未満のメモリしか必要としないデータ型を定義することはできません。
ビットフィールド (:
指定子) については、可能な限りすべての方法でメモリを節約する必要がある場合は、幸運にも次のようにすることができます。
typedef struct
{
char c1 : 4;
char c2 : 4;
} MyPackedByte;
これにより、1 バイト内に 2 つの 4 ビット値を格納できますが、この動作はコンパイラ固有である可能性があり、次のようなプリプロセッサ ディレクティブを使用する必要がある場合があります。#pragma pack
参照: #pragma pack 効果
unsigned char
構造体にorを使用しようとするかもしれませんがshort
、アライメントの問題もあります。
ビットフィールドに sizeof() 関数を使用できないはずです。int を「カット」する方法を設定するのはあなただけです。後でサイズを取得する必要がある場合は、どこかに保存できますか? typedef struct { ``unsigned bit : 1, bit2 : 3; のようなもの。
size_t size_bit1, size_bit2; }少し;
void initBIT() {
size_bit1 = 1;
size_bit2 = 3; }
1ビットしか必要ないのに、なぜ構造体があるのですか? ストレージの最小単位はバイト (通常は 1 文字) です。typedef BIT を char にしないのはなぜですか?