C言語でのメモリアライメント

構造の長さといえば

構造を研究するとき、先生は非常に興味深い質問を残しました:

#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です。

おすすめ

転載: blog.csdn.net/ALITAAAA/article/details/103043116