Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ 構造体におけるアライメントとパディング | 構造体とメモリの理解
C構造体

構造体におけるアライメントとパディング

メニューを表示するにはスワイプしてください

アライメント

各構造体フィールドは、その構造体内で最も大きい要素のサイズの倍数となる境界に揃えられる。

例えば、最も大きい要素が4バイトの場合、各要素は4バイト境界に揃えられる。

これはメモリアクセスの高速化やハードウェアのアライメント問題を回避するために行われる。

main.c

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バイトになると考えがちです。実際には、少し異なる仕組みになっています。

最初のフィールド achar 型で、1バイトを占有します。次のフィールド bint 型)が4バイト境界から始まるように、コンパイラは a の後に3バイトのパディングを追加します。フィールド b 自体は4バイトを占有し、正しくアラインメントされています。

次のフィールド cdouble 型で、8バイト境界から始まる必要があります。コンパイラは b の後にパディングを追加し、c を正しいアドレスに配置します。フィールド c は8バイトを占有します。

合計で:a に1バイト + パディング3バイト + b に4バイト + c に8バイト = 16バイトとなります。アラインメント規則が守られ、メモリが効率的に使用されています。

question mark

なぜ struct のサイズは、個々のフィールドのサイズの合計よりも大きくなることが多いのでしょうか?

正しい答えを選んでください

すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 3.  2

AIに質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の1つを試してチャットを始めてください

セクション 3.  2
some-alt