プログラミングの参考書は数多くあれど、アライメントの話が
出ている本は、殆ど見た記憶がない。
よって、以下の説明は、私の推論によるものであり、間違っている可能性もある。
まずは、定義から。
「プリミティブな値は、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);}
};
(このように、データと関数をまとめたいときはクラスにするとよい。)