セーブデータを構造体のバイナリで保存していて、
その構造体に変数を追加したいが、過去バージョンと互換性は保ちたい…という場合、
アライメントを意識する必要があるそうな。

// 32バイトのセーブデータ ver.1
struct savedata
{
char c; // 1byte
char buffer[31]; // バージョンアップしたら、構造体のサイズを維持するため、ここから引いていく
};


↓ ソフトバージョンアップ

// 32バイトのセーブデータ ver.2
struct savedata
{
char c; // 1byte
double d; // 8byte
char buffer[23]; // 8バイトの変数を追加したから、31-8 = 23でサイズは保たれる。かと思いきや…
};

バイト境界が8バイトの場合、1バイトのcの次に8バイトのdを配置すると、dを8バイトごとの区切りでメモリ上に確保しようとするので、cとdの間に7バイトのパディングが入ります。
さらに、構造体そのもののサイズも区切りよくするため、1バイト分のパディングが入り、
1 + 7 + 8 + 23 + 1 = 40バイトの構造体になり、バージョンアップにより互換性が取れなくなってしまいます。
よくわからなくなったら、sizeofで前のバージョンとサイズ比較するのがよさそうです。

この例の場合は、↓のようにするとうまくいくはず。

// 32バイトのセーブデータ ver.2
struct savedata
{
char c; // 1byte
// 7byteのパディングがここに入る
double d; // 8byte
char buffer[16]; // 32 - (1 + 7(padding) + 8) =  16
};


ただし、バイト境界はOSやら何やらで変わったり、パディングしない設定もあるとかなんとか。



<参考>
構造体のサイズとアライメント