2013-01-07 14 views
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バイトである理由はわかりません。 誰かがこれを説明できますか? C規格から感謝サイズが期待された出力を示していません

+2

:ビットフィールドの実装はコンパイラに依存しているという事実のほかに

は、すべてのビットフィールドの構造は、実際にメモリ内に次のように保存されている可能性があります*」ビットフィールドについてのほとんどは、実装に依存します。個人的に私は「ほとんど」を省いたでしょう。 – cdarke

+2

@cdark残りは指定されていないので*ほとんど* – ouah

答えて

6

(C99、6.7.2.1p10)「[...]十分なスペースが残っている場合は、収まらないビットフィールドが投入されているかどうかを 次のユニットまたは隣接ユニットの重複は 実装定義です。

だからあなたの実装では、彼らは重複しない:abメンバーが一つのユニット、cにあり、dは、別の1つのユニットにしているとeは、別の1つのユニットにある:8 + 8 + 8 = 24。次いで

6
64ビットマシンの

、フィールドab使用構造体の最初の64ビット値の60ビット、cd使用構造体の次の64ビット値の60ビット、およびeためその64ビット値から残っている4ビットに収まりきらない8ビットなので、別の64ビット値が必要です。したがって、8×3 = 24バイト。

3

ビットフィールドの要素は2つのメモリ「ユニット」と重ならないでしょう(あなたの場合、メモリユニットは64ビットの要素です)。 K&Rのページ150:あなたはビットフィールドを使用している

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;