Message_Header_type
はまだ2つのバイトを取っているが、あなたのRaw_Message_Type
は、132バイト長の代わりに、あなたが予想される130バイトであるので、コンパイラは、アライメントの理由で構造をパディングされます。これはおそらく、32ビットの整列されたアクセスがプロセッサ上でより効率的であるためです。
gccを使用している場合は、#pragma pack
を使用して使用している4バイトの境界ではなく、2バイト境界で整列するようにコンパイラに指示できます。ファイル内の固定サイズの構造体を使用しますが、プロセッサが好むものとは異なる梱包を使用するための(光)パフォーマンスの低下があるかもしれないことに注意してたときに、このような
typedef struct
{
unsigned char msg_id : 8;
unsigned char msg_num : 8;
} Message_Header_Type;
#pragma pack(push, 2) // save current alignment and set to 2-byte boundaries
typedef struct
{
Message_Header_Type header;
int msg[32];
} Raw_Message_Type;
#pragma pack(pop) // restore the previous alignment
特別な梱包がしばしば必要です。この特定の場合、32 msg [] int
はすべて、ご使用のプラットフォームの優先アライメントから2バイト離れた位置になります。
構造体をパックすると、 'Message_Header_Type'を2バイトまで下げることができますが、' Raw_Message_Type'では 'header'に2バイトのパディングが続いている可能性があります。 4バイトの境界に揃えられます。 – Dmitri