構造記憶
1. 質問する
構造体は連続したメモリ空間を占有し、サイズはメンバー変数の型によって決まります。しかし、すべてのメンバー変数の型サイズの合計を計算するほど単純ではありません。
最初に例を挙げる:
struct student {
int age; //4个字节
int telephone; //4个字节
};
int main()
{
struct student s;
// s的字节为8;
printf("%d", sizeof(s));
return 0;
}
図に示すように、構造体 student には int 型の 2 つのメンバー変数が含まれています。コードを実行すると、構造体のサイズが8 バイトであることがわかります。
しかし、それは本当に 2 つのメンバー変数のサイズの合計によるものでしょうか?
別の例を見てみましょう:
struct student {
int age; //4个字节
char name; //1个字节
int telephone; //4个字节
};
int main()
{
struct student s;
// s的字节为12;
printf("%d", sizeof(s));
return 0;
}
図の 3 つのメンバー変数は int、char、および int型であり、3 つのメンバー変数のメモリは合計で 9 バイトになります。
しかし、構造メモリが 12 に等しいのはなぜですか?
明らかに、構造体のメモリ サイズは、 すべてのメンバー変数のメモリ サイズの合計と等しくありません。
2.構造体のメモリサイズを計算する
構造体のメモリサイズを計算するときは、まず規則 --- 整列規則を学習する必要があります。
1. 最初のメンバは、構造体変数からのオフセットが 0 のアドレスにあります。2. その他のメンバ変数は、ある数の整数倍のアドレス
にアラインする必要があります(アラインメント番号) 。整列 = コンパイラのデフォルトの整列とメンバー サイズの小さい方の値。 (VS のデフォルト値は 8 です) 3.構造体の合計サイズは、最大アラインメント数の整数倍です(各メンバー変数にはアラインメント数があります) 。4. 構造体がネストされている場合、ネストされた構造体はその最大アラインメント数の整数倍にアラインされ、構造体全体のサイズは最大アラインメント数 (ネストされた構造体のアラインメント数を含む) の整数倍に等しくなります
理論が出てきたので、実際に計算してみましょう。
struct student {
int age; //1个字节
char name; //1个字节
int telephone; //4个字节
};
int main()
{
struct student s;
// s的字节为12;
printf("%d", sizeof(s));
return 0;
}
たとえば、図を使用して説明した上記のコードは次のとおりです。
説明のアイデア:
- まず、規則に従って、最初のメンバーはアドレス 0 にある必要があり、メンバーのメモリサイズは 4 バイトであるため、アドレス 0~3 の4 つのスペースを占有します。
- The second member variable must start to follow thealign rules . char は 1 バイトなので、アドレスが何であっても 1 の整数倍であり、アドレス 4 のスペースも占有します。
- 最後に、3 番目のメンバーは int 型で、この時点でアドレスは 4 の位置に達しており、int 型の 4 バイトの整数倍を整列する必要があります。8 から開始して4 つのスペースを占有するまで必要です。 、住所8~11。
- End:構造体の合計サイズは最大アライメント (メンバ変数メモリ) の整数倍で、構造体の最大メモリ タイプは int 4 バイトで、このとき使用されるメモリは 0 ~ 11 で、12 です。 . 条件を満たすため。
注: 満たされていない場合は、満たされるまで拡張する必要があります。
作るのは簡単じゃない 通りすがりのイケメンや美女たち 小さな手を動かして 好きなようにカニ
記事に問題がある場合は、ご指摘いただき、冷静に批判を受け付けてください