アライメントとは

アライメントはC言語の規格ではない。CPU の都合によるものである。 つまり、処理系依存の仕様である。
英語では、alignmentだからアラインメントかもしれない。 (ちなみに、英語の意味は「整列、調節」である。)

プログラミングの参考書は数多くあれど、アライメントの話が 出ている本は、殆ど見た記憶がない。
よって、以下の説明は、私の推論によるものであり、間違っている可能性もある。

まずは、定義から。

「プリミティブな値は、min(そのサイズ、アライメント)の倍数のアドレスにおかれなければいけない。 これは、構造体の中の変数にも適用される。また、配列で使われることも想定しなくてはいけない。 この規則を満たすためにアドレスがずれてできる空きをパディングという。」

この定義から、アライメントが1ならば、パディングはできない。 また、charもサイズが1なので、どこにでもおける。 私の使っている環境(UNIX、Win95)では、C,C++ではアライメントは8である。VBでは4である。 また、VCでは変更することも可能である。

アライメントが問題になることは殆どないが、異なるプラットフォームで通信を 行うときには、問題となることがある。そのときは、明示的にパディングを作ることが多い。

もう1つ問題になるのは、オブジェクトのサイズである。例えば、

class TestA {
    char    c;
    int     i;
    double  d;
};

class TestB {
    int     i;
    double  d;
    char    c;
};
というクラスは並びかたが違うだけだが、オブジェクトのサイズが異なる。 (アライメントが8以上の場合。)sizeof演算子で確認して欲しい。 このようなことを避けるには、同じ型の変数はなるべくまとめるとよい。 (それだけでは駄目なのは上の例から明らかだが。)

ちなみに、アライメントを求めるには、次のようにすればできる。 (但し、sizeof(double)までしか判らない。)

class Alignment {
    char    dumy1;
    double  dumy2;
public:
    static int GetAlignment()
        {return sizeof(Alignment) - sizeof(double);}
};
(このように、データと関数をまとめたいときはクラスにするとよい。)
ここで、dumy1とdumy2は順番を入れ替えても構わない。 (どちらも、dumy1の後ろにパディングが入る。)
なぜなら、Alignmentオブジェクトの配列を考えたとき、dumy2がいつでも 8の倍数のアドレスになるためには、常に、dumy1の後にパディングがいるからである。 (そうでないと、配列のアクセスで余計なことを気にしないといけなくなる。)

戻る