考慮する:
struct mystruct_A
{
char a;
int b;
char c;
} x;
struct mystruct_B
{
int b;
char a;
} y;
構造物のサイズはそれぞれ 12 と 8 です。
これらの構造物はパッド入りですか、それとも詰め物入りですか?
パディングや梱包はいつ行われますか?
ベストアンサー1
パディング 整列する構造体のメンバーを「自然な」アドレス境界にマッピングします。つまり、int
メンバーには 32 ビット プラットフォーム上のオフセットがありますmod(4) == 0
。パディングはデフォルトでオンになっています。これにより、最初の構造体に次の「ギャップ」が挿入されます。
struct mystruct_A {
char a;
char gap_0[3]; /* inserted by compiler: for alignment of b */
int b;
char c;
char gap_1[3]; /* -"-: for alignment of the whole struct in an array */
} x;
一方、をパッキングする__attribute__((__packed__))
と、コンパイラーがパディングを行うことができなくなります。これは明示的に要求する必要があります。GCC では であるため、次のようになります。
struct __attribute__((__packed__)) mystruct_A {
char a;
int b;
char c;
};
6
32 ビット アーキテクチャ上でサイズの構造体を生成します。
ただし、注意点として、アラインされていないメモリ アクセスは、それを許可するアーキテクチャ (x86 や amd64 など) では遅くなり、SPARC などの厳密なアラインメント アーキテクチャでは明示的に禁止されます。