2
#include<stdio.h>
static struct s
{

    unsigned a:5;
    unsigned b:5;
    unsigned c:5;    
    unsigned d:5;

}v={1,2,3,4};

int main()
{
    printf("size of v = %d\n",sizeof(v));
}

「答えは4です」 . この出力については説明できません。

#include<stdio.h>
static struct s
{

    unsigned a:5;
    unsigned b:5;

}v={1,2};

int main()
{
    printf("size of v = %d\n",sizeof(v));
}

「答えはまだ4です」 ..ビットフィールドは構造サイズにどのように影響しますか??

4

4 に答える 4

4

デフォルトでは、gcc はデータをバイト境界に整列し、一部のプラットフォーム (特に RISC) では機械語境界に整列します。これは、(RISC マシンでは) バイト境界で整列されていない読み取りによって例外が発生し、プログラムの速度が低下するためです。そのため、5 ビットの長さしかない場合でも、すべてのフィールドが独自のバイトに格納されます。適切にパッキングするには、次を使用します__attribute__((packed))

#include<stdio.h>

static struct s
{
    unsigned a:5 __attribute__((packed));
    unsigned b:5 __attribute__((packed));
}v={1,2};

int main()
{
    printf("size of v = %d\n",sizeof(v));
}

これの出力は次のとおりです。

size of v = 2

これは合計 10 バイトであるため、サイズは次のバイトに切り上げられます。

于 2013-06-16T11:52:26.917 に答える
2

ビットフィールドのタイプとして使用した場合unsigned char、サイズ 4 とサイズ 2 のそれぞれが得られます。のアラインメント、つまりサイズは、struct通常、ビットフィールドの整数型によって決まります。特にビットフィールドを使用した構造体のパッキングは、高度に実装定義されていますが、6.7.2.1 ad 11 によって指示されています。

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

ほとんどのコンパイラは、ビットフィールドで指定された整数型を「アドレス指定可能な記憶単位」として使用します。

構造体のパッキングは、多くの場合、アーキテクチャのアプリケーション バイナリ インターフェイス (ABI) の一部として指定され、このアーキテクチャのコンパイラの相互運用性を確保することにも注意してください。

x86 アーキテクチャ用の GCC コンパイラを想定して、例をさらに詳しく説明します。

struct
{       unsigned int a:5;
        unsigned int b:5;
        unsigned int c:5;
        unsigned int d:5;
};

4 つのビット フィールドは、32 ビット コンテナーの最初の 20 ビットに配置されます。

struct
{       unsigned char a:5;
        unsigned char b:5;
        unsigned char c:5;
        unsigned char d:5;
};

各ビット フィールドは独自の 8 ビット コンテナーに配置されるため、ここでも 32 ビットです。

struct
{       unsigned int a:5;
        unsigned int b:5;
};

ビット フィールドは 32 ビット コンテナーの最初の 10 ビットにあるため、構造体全体は 32 ビットのままです。

struct
{       unsigned char a:5;
        unsigned char b:5;
};

両方のビット フィールドはそれぞれ独自の 8 ビット コンテナーに配置されるため、構造体全体は 16 ビットです。

struct
{       unsigned char a:5;
        unsigned char b:3;
        unsigned char c:3;
        unsigned char d:5;
        unsigned char e:5;
};

ビット フィールドaでありb、8 ビット コンテナー内にあります。ビット フィールドcdは 8 ビット コンテナーにあり、ビット フィールドeは 8 ビット コンテナーにあり、合計で 24 ビットになります。

于 2013-06-16T12:04:47.053 に答える