構造体のメモリレイアウトの理解
メニューを表示するにはスワイプしてください
Cプログラミング言語におけるメモリ構造は、データがメモリ上でどのように格納およびアクセスされるかを理解する上で重要な役割を果たします。 Cで構造体が定義されると、コンパイラはアライメントおよびパディングの規則に基づいて、そのメンバーをメモリ上にどのように配置するかを決定します。
Cにおける構造体の基本的なメモリアロケーションの仕組みの概要は次のとおりです:
main.c
123456789101112131415#include <stdio.h> // simple struct struct Test { char x; // 1 byte int y; // 4 bytes }; int main() { struct Test example; printf("Size of struct Test: %zu\n", sizeof(example)); printf("Address of example.x (char): %p\n", &example.x); printf("Address of example.y (int): %p\n", &example.y); return 0; }
予想通り、このような構造体は5バイトを占有するはずです:char xに1バイト、int yに4バイトですが、実際には8バイトとなります。
なぜ構造体のサイズが予想よりも大きくなるのでしょうか?
これは、各メンバーがそのサイズの倍数のアドレスから始まるように、コンパイラがメンバー間にパディングを挿入するために発生します。
画像では、メモリの最初の部分(明るい部分)が変数char xに割り当てられており、これは1バイトのみを使用しています。その後に3バイトの空き領域があり、これがパディングです。これは、次の要素が正しいアドレスから始まるようにコンパイラによって自動的に追加されます。パディングの後に、変数int yが格納され、これは4バイトを占有します。
その結果、構造体全体で8バイトを使用します:charに1バイト、アライメント用に3バイト、intに4バイトです。
このレイアウトは、プロセッサがデータにより効率的にアクセスできるようにするために存在します。アライメントがなければ、構造体メンバーへのアクセスに時間がかかり、プログラムの実行速度が低下します。
すべて明確でしたか?
フィードバックありがとうございます!
セクション 3. 章 1
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください
セクション 3. 章 1