読者です 読者をやめる 読者になる 読者になる

ぱでぃんぐ、ぱでぃんぐ、ぱでぃんぐー

と脳内で再生されたので。

via ときどきの雑記帖様。

実は今回の話題にはまだミステリーが残っている。 例えばリストFのような二つの値を持つ 構造体へのポインタに1を足すと、 いったいいくつ増えるだろうか? 「int型が4バイト、char型が1バイトなので5増える」 と考えた読者は 不正解 である。 実際には8増えるのである。

次回、なぜ8増えるのか、なぜ8増やした方がよいのか… というミステリーを考えてみよう。

struct sample
{
int x;
char y;
}

404 Not Found
typedef struct tagSample
{
    int x;
    char y;
} Sample;

int main()
{
    printf("[%ld].?n",sizeof(Sample));
    return 0;
}

を(OSX環境のgccで)実行すると、
プラグマ無指定、
#pragma pack(1)、
#pragma pack(2)、
の時で構造体のサイズが変わる。

具体的には、
8,
5,
6,
アクセス効率を考えるとCPUが最も最適な速度でアクセスできるようにマッピングされるべきだけど、
どうしても詰めたい、と書かないことがないわけでもない。
要するにどういう風にメモリに収まっていて、ポインタがそれらをどうやって指すのかを示す際に、
これらの挙動を無視して「不正解」と言ってしまうのはいかがなものか、というお話。

というか、これらの挙動を説明する際に「ミステリー」と言ってしまうのは違和感があるなぁ、とかなんとか。

ただ、
char padding;
とか宣言した懐かしい日々と、
#pragma pack(2)
が書きたくて書きました。
そんだけ。