0
#include <stdio.h>

struct node
{
     unsigned color : 2;
};

void main()
{
     struct node n; 
     n.color = 1;
     printf("size is :%d\n", (int)sizeof(n));
}

コンパイラは、このタイプの割り当てにどのようにメモリを割り当てますか?

printf は、サイズが :4 の出力を提供します。

4

4 に答える 4

2

コンパイラは、各メンバーへのアクセスを高速化するために、構造体の 2 つのメンバー間に空きスペースを割り当てることがよくあります。これはパディングと呼ばれます。アラインメントのサイズは、主にプロセッサ アーキテクチャに依存します。

struct data_struct
{
    char a;
    int b;
};

i386 で sizeof 演算子を使用して構造体のサイズを取得すると、8 になります。ただし、sizeof(char) は 1 で、sizeof(int) は 4 であるため、合計 5 バイトが必要ですが、コンパイラは 8 バイトを割り当てました。実際には、char メンバーにも 4 バイトが割り当てられました。

于 2013-03-17T05:54:13.920 に答える
1

コンパイラは、位置合わせのために構造体をパディングします。これは、マシンのアーキテクチャに依存するため、移植できません。

于 2013-03-17T05:47:35.767 に答える
0

構造体または共用体のメンバーは、可変的に変更された型以外の完全なオブジェクト型を持つことができます。さらに、メンバーは、指定された数のビット (符号ビットがある場合はそれを含む) で構成されるように宣言できます。そのようなメンバーはビットフィールドと呼ばれ、その幅の前にコロンが付きます

実装では、ビットフィールドを保持するのに十分な大きさのアドレス指定可能なストレージユニットを割り当てることができます。十分なスペースが残っている場合、構造内の別のビットフィールドの直後に続くビットフィールドは、同じユニットの隣接するビットにパックされます。十分なスペースが残っていない場合、収まらないビットフィールドが次のユニットに配置されるか、隣接するユニットとオーバーラップするかは実装定義です。ユニット内のビットフィールドの割り当て順序 (上位から下位、または下位から上位) は実装定義です。アドレス可能なストレージ ユニットのアラインメントは指定されていません。

構造体オブジェクト内で、非ビット フィールド メンバーとビット フィールドが存在するユニットには、宣言された順序で増加するアドレスがあります。適切に変換された構造体オブジェクトへのポインターは、その最初のメンバー (または、そのメンバーがビットフィールドの場合は、それが存在するユニット) を指し、その逆も同様です。構造体オブジェクト内に名前のないパディングがある場合がありますが、先頭にはありません。

——ISO/IEC 9899:201x 6.7.2.1

sizeof が char、unsigned char、または signed char (またはその修飾バージョン) 型を持つオペランドに適用されると、結果は 1 になります。配列型を持つオペランドに適用されると、結果はバイトの合計数になります。 103)構造体型または共用体型を持つオペランドに適用すると、結果は、内部および末尾のパディングを含む、そのようなオブジェクトの合計バイト数になります。

——ISO/IEC 9899:201x 6.5.3.4.4

于 2013-03-17T06:18:57.940 に答える
0

ビット数を考慮せずに、ビットフィールド宣言で指定された型を格納するのに十分なスペースを割り当てます。あなたの場合、符号なし整数のサイズは 4 バイトです。

于 2013-03-17T05:51:37.653 に答える