私たちの実際の生活では、保存されたデータは一般的に同じタイプではないため、構造が導入されています。また、構造体のサイズは、メンバー型のサイズの単純な加算ではありません。構造体変数を格納する場合、システムのアドレス配置を考慮する必要があります。
ストレージ変数のアドレス配置の問題により、構造体サイズの計算は次の 2 つの原則を満たす必要があります。
1. 構造体メンバーのオフセットは、メンバー サイズの整数倍でなければなりません (0 は任意の数の整数倍と見なされます)。
2. 構造体のサイズは、すべてのメンバーのサイズの整数倍でなければなりません
詳しく分析してみよう
1.シンプルな構造
struct s1{
char ch1;
char ch2;
int i;
};
この構造のサイズは簡単に計算でき、8 という 2 つの原則を満たすだけで済みます。
struct s2{
char ch1;
int i;
char ch2;
};
この構造体のサイズは 12 ですが、なぜですか? 2 つの原則を詳しく見てみましょう.オフセットがメンバーの整数倍であることを満たすには、ch1 のオフセットは 0 であり、i のオフセットは 1 ではありません。1 は i のサイズ 4 の倍数ではないため、オフセットはof i 4 だと ch2 のオフセットは 8 になるので、構造体のサイズはメンバサイズの整数倍の 12 になります。
2. メンバーに配列が含まれる構造体
struct s3{
char ch;
int i;
char str[10];
};
この構造体のサイズは 20 です。まず、最初の 2 つのメンバーを見てください。サイズは 8 です。この char 型の配列は、10 個の文字が連結されたものと見なすだけでよく、合計は 18 であり、構造体のサイズはメンバーの整数倍なので、サイズは 20 です。
3. メンバーに構造体が含まれる構造体
(1)
struct s4{
char ch;
int i;
struct s{
char ch1;
int j;
}a;
float f;
};
内部の構造体 s のサイズは 8 なので、構造体 s4 のサイズは 8 に揃える必要がありますか? この構造体 s4 のサイズは 20 で、明らかに 8 の倍数ではありません。したがって、構造体 s4 のサイズを計算するときは、内部の構造体 s を全体としてではなく、char および int と見なします。
struct s4{
char ch;
int i;
struct s{
char ch1;
int j;
};
float f;
};
構造体 s4 のサイズは 12 ですが、内部の構造体は変数を宣言せずにデータ型を定義するためだけに使用されるため、メモリ空間を占有せず、内部の構造体を個別に取り出すことはできません。 . 変数を宣言するには (sa; など)、周辺の構造体変数をドット演算子 (s4 a; as b; など) で宣言して宣言することはできないため、内部の構造体は実用的です。
4. メンバーに共用体が含まれる構造体
struct s5{
char ch;
int i;
union p{
char ch1;
int j;
}a;
};
共用体のサイズはメンバーの中で最大の型のサイズなので、この構造体のサイズは 12 です。
(2)
struct s5{
char ch;
int i;
union p{
char ch1;
int j;
};
};
この構造体のサイズは 4.(2) と同じ 8 です。
5.アライメント値を指定する
(1)对齐值小于最大类型成员值
#pragma pack(4) //指定向4对齐 最大是8
struct s6{
char ch;
int i;
float f;
double d;
};
アラインメント値を指定しない場合、この構造体のサイズは 24 です。アラインメントを 4 に指定すると、サイズは 4 の倍数になり、構造体のサイズは 20 になります。
(2)对齐值大于最大类型成员值
#pragma pack(10)
struct s7{
char ch;
int i;
float f;
double d;
};
指定した位置合わせの値は 10 で、最大値は 8 ですが、10 に位置合わせする必要がありますか? いいえ、指定されたアラインメント値がそれ自体のアラインメント値よりも大きい場合、その値をそれ自体にアラインし、サイズは 24 です。
一般に、指定された位置合わせ値とそれ自体の位置合わせ値の小さい方に位置合わせします。