このブログは、旧・はてなダイアリー「檜山正幸のキマイラ飼育記 メモ編」(http://d.hatena.ne.jp/m-hiyama-memo/)のデータを移行・保存したものであり、今後(2019年1月以降)更新の予定はありません。

今後の更新は、新しいブログ http://m-hiyama-memo.hatenablog.com/ で行います。

#pragma pack(n)

For compatibility with Microsoft Windows compilers, GCC supports a set of #pragma directives that change the maximum alignment of members of structures (other than zero-width bit-fields), unions, and classes subsequently defined.

あー良かった。#pragm pack(1) とかは、そのままでもGCCで効くのだな。これが効かないとバイナリ操作ではエライことになる。

念のために、sizeof(TheStruct) で確認したほうがいいけど。

[追記]

確認してみた、pack(1), pack(2), pack(4) は期待通りだけど、8, 16は効かない。4までってことか。これは32ビットコンパイラだからか?と思ってtdm g++でもやったが同じ結果。まー、pack(1)が効けばいいや。

#pragma pack(1)
struct Foo1 {
    unsigned long ul; // 4 bytes
    char c; // 1 byte
} foo1;

#pragma pack(2)
struct Foo2 {
    unsigned long ul; // 4 bytes
    char c; // 1 byte
} foo2;

#pragma pack(4)
struct Foo4 {
    unsigned long ul; // 4 bytes
    char c; // 1 byte
} foo4;

#pragma pack(8)
struct Foo8 {
    unsigned long ul1; // 4 bytes
    unsigned long ul2; // 4 bytes
    char c; // 1 byte
} foo8;

#pragma pack(16)
struct Foo16 {
    unsigned long ul1; // 4 bytes
    unsigned long ul2; // 4 bytes
    char c; // 1 byte
} foo16;


#include <stdio.h>

int main()
{
    printf("sizeof foo1 %d\n", sizeof(foo1)); // 5
    printf("sizeof foo2 %d\n", sizeof(foo2)); // 6
    printf("sizeof foo4 %d\n", sizeof(foo4)); // 8
    printf("sizeof foo8 %d\n", sizeof(foo8)); // 12 ?
    printf("sizeof foo16 %d\n", sizeof(foo16)); // 12 ?
}

[/追記]

[さらに追記]#pragma pack(1) と指定して、隙間無しの構造体が作れる。そのような定義の最後で、#pragma pack() として、パックの仕方をデフォルトに戻すのがお作法のようだ。必要なところだけ隙間無し構造体として、隙間が問題にならないならデフォルトが良い、ということだね。[/さらに追記]