7
#include <stdint.h>
#include <stdio.h>

typedef union {
    uint64_t u[2];
    struct {
        uint64_t a:30;
        uint64_t b:30;
        uint64_t c:30;
        uint64_t d:30;
        uint64_t e:8;
    }x;
} mystruct;

int main()
{
    printf("Size %d\n", sizeof(mystruct));
}

64ビットマシンでコンパイルしようとしています。予想される出力は 16 でしたが、24 を取得しています。ここでアライメントが発生したことはわかっていますが、構造体 x が正確に 16 バイトであるため、その理由はわかりません。誰かがこれを説明できますか。ありがとう

4

3 に答える 3

6

C標準から:

(C99、6.7.2.1p10) 「[...] 十分なスペースが残っていない場合、収まらないビットフィールドが次のユニットに配置されるか、隣接するユニットとオーバーラップするかは実装定義です。」

aしたがって、実装では重複しません。bメンバーは1つのユニットにcありd、別の1つのユニットにeあり、別の1つのユニットにあります8 + 8 + 8 = 24

于 2013-01-07T19:43:03.510 に答える
6

64 ビット マシンの場合、フィールドは構造体の最初の 64 ビット値の 60 ビットを使用し、構造体aの次の 64 ビット値の 60 ビットを使用します。その 64 ビット値から残った 4 ビットなので、別の 64 ビット値が必要です。したがって、8x3 = 24 バイトです。bcde

于 2013-01-07T19:44:11.697 に答える
3

ビット フィールドの要素が 2 つのメモリ「ユニット」とオーバーラップすることはありません (この場合、メモリ ユニットは 64 ビット要素です)。

ビットフィールドの実装がコンパイラに依存するという事実に加えて、ビットフィールド構造が実際に次の方法でメモリに格納される可能性がすべてあります。

struct {
    uint64_t a:30;
    uint64_t b:30;
    uint64_t :4;
    uint64_t c:30;
    uint64_t d:30;
    uint64_t :4;
    uint64_t e:8;
    uint64_t :56;
}x;
于 2013-01-07T19:45:18.523 に答える