構造体におけるアライメントとパディング
メニューを表示するにはスワイプしてください
アライメント
各構造体フィールドは、その構造体内で最も大きい要素のサイズの倍数となる境界に揃えられる。
例えば、最も大きい要素が4バイトの場合、各要素は4バイト境界に揃えられる。
これはメモリアクセスの高速化やハードウェアのアライメント問題を回避するために行われる。
main.c
1234567891011121314151617181920#include <stdio.h> // simple struct struct Example { char a; int b; double c; }; int main() { struct Example test; printf("Size of struct Example: %zu\n", sizeof(test)); printf("Address of test.x (char): %p\n", &test.a); printf("Address of test.y (int): %p\n", &test.b); printf("Address of test.c (double): %p\n", &test.c); return 0; }
struct Example のサイズが16バイトである理由について疑問に思うかもしれません。各フィールドが最大型(8バイト)の境界に揃えられているにもかかわらず、合計サイズが24バイトになると考えがちです。実際には、少し異なる仕組みになっています。
最初のフィールド a は char 型で、1バイトを占有します。次のフィールド b(int 型)が4バイト境界から始まるように、コンパイラは a の後に3バイトのパディングを追加します。フィールド b 自体は4バイトを占有し、正しくアラインメントされています。
次のフィールド c は double 型で、8バイト境界から始まる必要があります。コンパイラは b の後にパディングを追加し、c を正しいアドレスに配置します。フィールド c は8バイトを占有します。
合計で:a に1バイト + パディング3バイト + b に4バイト + c に8バイト = 16バイトとなります。アラインメント規則が守られ、メモリが効率的に使用されています。
すべて明確でしたか?
フィードバックありがとうございます!
セクション 3. 章 2
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください
セクション 3. 章 2