Intel プロセッサでは、32 ビットで整列されたデータのフェッチは、整列されていないデータよりもかなり高速です。他の多くのプロセッサでは、アラインされていないフェッチは完全に違法であるか、2 つの命令を使用してシミュレートする必要があります。したがって、最初の構造は、c
これらの 32 ビット アーキテクチャでは常に 4 で割り切れるバイト アドレスにアラインされます。ただし、これにはストレージで 2 バイトが浪費される必要があります。
struct s1 {
void *a;
char b[2];
int c;
};
// Byte layout in memory (32-bit little-endian):
// | a0 | a1 | a2 | a3 | b0 | b1 | NA | NA | c0 | c1 | c2 | c3 |
// addresses increasing ====>
一方、アラインされていないデータ構造 (ファイル形式やネットワーク パケットなど) をそのまま C 構造にマップする必要がある場合もあります。そこで、 を使用して、__attribute__((packed))
バイトをパディングせずにすべてが必要であることを指定できます。
struct s2 {
void *a;
char b[2];
int c;
} __attribute__((packed));
// Byte layout in memory (32-bit little-endian):
// | a0 | a1 | a2 | a3 | b0 | b1 | c0 | c1 | c2 | c3 |
// addresses increasing ====>