Last Updated 2005/08/31
Programming Tips Visual C++  索 引 
アライメント
2005/08/31


struct key_type1{
       int code;
       int code2;
} key1;


struct key_type2{
       int code;
       short code2;
} key2;

上記の key2 では予想に反して構造体のサイズが大きくなる.
これはアライメントが関係している.

ビルドの設定の C++ でアライメントを1バイトにすると予想の大きさになる.


設定を変更しなくてもソースで

#pragma pack(push) // push, pop は入れ子式だがタグを付けて回避できる
#pragma pack(1)

struct key_type {
   int code;
   short code2;
};

struct foo {
    char c1;
    char c2;
};

#pragma pack(pop)
このように指定できる.


または,pshpack1.h と poppack.h で囲う.


#include 
struct key_type{
    int code;
    short code2;
}key1;
#include 

なぜデフォルトでアライメントが8バイトになっているかは,奇数バイトが途中に存在するとメモリアクセスの効率が落ちるからである.
(効率だけまらまだしも,68000 などの CPU では奇数アドレスで WORD や DWORD をアクセスすると,システムにトラップされてエラーになってしまう)


参照
前後のTips
アライメント

DSS ProgrammingTipsCGI Ver2.02