構造の長さといえば
構造を研究するとき、先生は非常に興味深い質問を残しました:
#include<stio.h>
#include<string>
struct Node
{
char name;
int string;
char ssex;
};
int main()
{
int size;
size = sizeof(Node);
printf("%d ", size);
system("pause");
return 0;
}
明らかに、構造が占めるバイト数を探しています。メモリアライメントの概念に触れないと、答えが曖昧になる可能性が高くなります:6。charは1バイト、intは4バイト、1 + 4 + 1 = 6を占めるため、構造体のバイトサイズは6です。もちろん、これは間違っています。コンパイラをオンにしてコンパイルして実行すると、結果は次のようになります。12。そして、構造の順序を変更するだけです。
#include<stio.h>
#include<string>
struct Node
{
char name;
char ssex;
int string;
};
int main()
{
int size;
size = sizeof(Node);
printf("%d ", size);
system("pause");
return 0;
このとき、コンパイラーをコンパイルして実行すると、操作の結果は次のようになります。8 ;結果がどのように得られたかについては説明する価値があります。
メモリアライメントルール
1)構造体変数の最初のアドレスは、その最長の基本型メンバーの整数倍です。
2)構造体の最初のアドレスに対する構造体の各メンバーのオフセット(オフセット)は、メンバーサイズの整数倍です。
3)構造体の合計サイズは、構造体の最も幅の広い基本型メンバーのサイズの整数倍です。
具体的なルールは百度百科事典から引用しています。上記のルールに従って直接説明しましょう。
上記の最初のプログラムでは、構造体の最初のデータ型がcharであるため、ルール1に従って1バイトを占めることは間違いありません。したがって、この時点での構造体のバイト数は1です。int型に関しては、intは4バイトを占めるため、ルール2に従って、長さが4の倍数になるようにオフセットから開始する必要があります。したがって、4から始まる3つのオフセットが追加され、4バイトより上に追加されます。 intが占める場合、構造体の長さは8になります。そして最後の文字まで、占有されるバイト数は1ですが、ルール3によれば、合計サイズは最も広いタイプの整数倍でなければならないため、8から開始する場合は、1とを追加する必要があることは間違いありません。 3オフセットビット。3つのルールすべてが確実に満たされるように、全長を12にします。したがって、最終結果は12になりました。
2番目のプログラムでは、構造体の最初のデータ型がcharであるため、ルール1に従って1バイトを占めることは間違いありません。したがって、この時点で構造体のバイト数は1であり、2番目のプログラムはまた、char。1を追加し続けるだけです。全長が2になり、3番目のint型に到達します。intは4バイトを占めるため、ルール2に従って、長さを4にするためにオフセットする必要があります。 2つのオフセットが追加され、最初のアドレスは4になります。4から始まり、intが占める4バイトに加えて、構造体の長さは8になります。
別の例を見てみましょう:
#include<stdio.h>
#include<string>
struct Date
{
char dada;
int name;
int score;
};
struct node
{
char name;
char sddd;
char ssex;
int daef;
Date vie;
double dae;
};
int main()
{
int size;
size = sizeof(node);
printf("%d ", size);
system("pause");
return 0;
}
main関数から上から下に向かって、上記のルールを引き続き使用します。最初のルールは3文字タイプで、バイト数は3になります。上記の規則に従って、次のintは、4から始まるオフセットとそれ自体の4バイトによってオフセットされ、全長は8です。次に、構造体変数に遭遇し、前の構造体Dateに目を向けました。最初はcharで、長さは1になり、次にintになりました。最初に、オフセットは3〜4で、4バイトが追加されました。最後に、intを12に追加すると、Dateの全長は12になり、最も広いのは4になります。したがって、ノードのバイト数は8から始まり、12を足したものになります。 20。最後の1つはdoubleであるため、長さは8です。したがって、全長を4、24、プラス8でオフセットする必要があります。したがって、ノードの総バイト数は32です。