アライメントとパディングとは

あらいめんとぱでぃんぐ

データを、型ごとに決まった数の倍数の番地に置くこと(アライメント)と、そのためにデータの間や後ろに入れる使わないバイト(パディング、詰め物)。int が4バイトの境界にそろえられる環境では、struct { char c; int i; char d; } の c の後に3バイト、d の後に3バイトが入り、大きさは12バイトになる。境界にそろっていない番地の読み書きは、CPUによっては遅くなったり例外になったりする。メンバを大きい型から順に並べるとパディングを減らせる。

「アライメントとパディング」は、2分野の2問の練習問題に出てきます(命令セット・アセンブリ, C言語の基礎など)。

この用語の分野: C言語の基礎

アライメントとパディングの練習問題に挑戦

RISC-Vで4バイトを読むlw命令の番地が4の倍数でない(境界がそろっていない)とき、起こりうることとして正しいものはどれか。

  1. A命令が自動で次の4の倍数の番地に読み替えられ、常に同じ速さで正しく読める
  2. BCPUの実装によって、例外が起きたり、ハードウェアやソフトウェアで処理されて非常に遅くなったりする
  3. C番地の下位2ビットは無視され、エラーにはならない
答えと解説を見る

正解:B. CPUの実装によって、例外が起きたり、ハードウェアやソフトウェアで処理されて非常に遅くなったりする

4バイトのデータを4の倍数の番地に置くと、1回のメモリアクセスで読めます。境界をまたぐと2回のアクセスが必要になるため、RISC-Vは境界のずれたアクセスを回路で処理するか、例外を起こしてソフトウェアに任せるかを実装に委ねています。後者だと桁違いに遅くなります。コンパイラが構造体のメンバの間に詰め物(パディング)を入れて整列するのはこのためです。

解説の中の「アライメントとパディング」

「アライメントとパディング」が出てくる問題(2問)

  1. RISC-Vで4バイトを読むlw命令の番地が4の倍数でない(境界がそろっていない)とき、起こりうることとして正しいものはどれか。
  2. char は1バイト、int は4バイトで、int を4の倍数の番地にそろえて置く一般的な環境とする。上のコードを実行したときの出力として、正しいものはどれか。

C言語の基礎の参考書を探す PR

Amazonの検索結果へのリンクです。Amazonのアソシエイトとして、半導体教室は適格販売により収入を得ています。

関連する用語

構造体 配列 関数ポインタ 共用体 整数拡張 ダングリングポインタ 動的メモリ確保 バッファオーバーフロー ビットフィールド プリプロセッサ

用語集の一覧へ