2016-04-14 11 views
10

私は4100バイトを変数 "sample_union"に割り当てて宣言し、同じユニオン宣言を4104バイトを割り当てる構造体の一部として作成しました。構造体と共用体の間にサイズの不一致があるのはなぜですか?

union test_size_union { 
    struct { 
     uint8_t type; 
     union { 
      uint8_t count; 
      uint8_t list; 
     }; 
     uint16_t rc; 
     uint16_t arr_value[2048]; 
    }; 
    uint64_t first_dword; 
}__attribute__((packed)) sample_union ; 

上記の共用体を構造体内に配置すると、4104バイトが割り当てられます。

struct test_size_struct { 
    union { 
     struct { 
      uint8_t type; 
      union { 
       uint8_t count; 
       uint8_t list; 
      }; 
      uint16_t rc; 
      uint16_t arr_value[2048]; 
     }; 
     uint64_t first_dword; 
    }; 
}__attribute__((packed)) sample_struct; 

これはプロジェクトの要件ではありませんが、コンパイラがこの2つの宣言に対して異なる動作をする理由を知りたいと思います。

gccのバージョン:(GCC)4.9.2、x86_64版

プラットフォーム:Linuxでは、x86_64版は

あなたは、構造体の内側に労働組合を置い
+0

匿名の構造体はC++標準では許可されていないことに注意してください(GCCはそれを拡張子として提供しています)。 – user2079303

+0

これは主な機能です: int main(void) { printf( "size of sample_union =%d \ n"、sizeof(sample_union)));printf( "size of sample_struct =%d \ n"、sizeof(sample_struct)); return 0; }出力:sample_struct = 4104 – user50

+1

@JoachimPileborgのsample_union = 4100 サイズの大きさ:アレイタイプである 'uint16_t [2048]'ので、ほとんどのマシン上で4096バイトを占めます。 – DarkDust

答えて

11

、あなたはpackedとして組合をマークしませんでした。アンパックされた共用体は、そのサイズがuint64_tのサイズの倍数になるように、少しのパディング(4バイト)を持っています。

パッキングされたユニオンにはこのパディングがないため、パディングはありません。

側面観察では、ユニオン内の匿名の構造体にはpackedとマークされていません。これは問題ではありません。なぜなら、すべてがうまく整列しているからです。しかし、それは気づくべきことです。

関連する問題