アライメント
アライメント(alignment、境界調整)
メモリやストレージなどの記憶装置にデータを書き込む際、書き込むデータの大きさや先頭の位置(アドレス)を、装置の管理単位(ワード)の整数倍になるように調節すること
特定の型のオブジェクトを特定のバイトアドレスの倍数のアドレスをもつ記憶域境界に割り付ける要求。
アライメントという言葉はかなり理解しにくく感じるので、できるだけ境界調整という言葉を使った方が良いと思う
CPUによっては境界調整に寛容だったり厳しかったりする
C++11にはaligned_alloc()がある C言語のchar、short、int、long、long long、float、double、long double、ポインタ型のアライメントについて
下記はLinux(x86) + gccで実施した場合 型 sizeof アライメント 構造体上のアライメント?
char 1バイト 1バイト 1バイト
short 2バイト 2バイト 2バイト
int 4バイト 4バイト 4バイト
long 4バイト 4バイト 4バイト
long long 8バイト 8バイト 4バイト
float 4バイト 4バイト 4バイト
double(-malign-doubleなし) 8バイト 8バイト 4バイト
double(-malign-doubleあり) 8バイト 8バイト 8バイト
long double 12バイト 4バイト 4バイト
ポインタ型 4バイト 4バイト 4バイト
型 sizeof アライメント 構造体上のアライメント?
char 1バイト 1バイト 1バイト
short 2バイト 2バイト 2バイト
int 4バイト 4バイト 4バイト
long 8バイト 8バイト 8バイト
long long 8バイト 8バイト 8バイト
float 4バイト 4バイト 4バイト
double 8バイト 8バイト 8バイト
long double 16バイト 16バイト 16バイト
ポインタ型 8バイト 8バイト 8バイト
構造体で多分問題になりがちなのはlong long、double、long long
sizeof(long long): 8バイト
offsetof(S3, ll): 4バイト
sizeof(double): 8バイト
offsetof(S3, d): 4バイト
sizeof(long double): 12バイト
offsetof(S3, ld): 4バイト
関連
確認用
Q. アライメントとは
Q. アライン
Q. なぜアライメントが必要なのか
Q. データ整列
Q. メモリアライメント
Q. データ構造パディング
Q. アライメントを守るとは
Q. アライメントを調整するとは
Q. アライメントの例
Q. ワード境界
Q. キャッシュライン境界
Q. データアライメント
参考
最近のコンピュータはバイトマシンらしい
アライメントは、何バイト境界にアラインすればよいか
アラインメントは CPU のハードウェアに起因する問題であり, データのメモリアドレスに関する制約である.
・基本的にプリミティブ型の変数は、そのデータ型のサイズのアライメントを持つ。(ただし、このサイズがデータバスより大きい場合はデータバスのサイズになることが多い。例えば、僕の32bit環境の8byteであるdoubleのアライメントは4byteだった。)
・配列や構造体といった集成体型のアライメントは、そのデータ型が持つメンバの中で最も大きなアライメントを持つものと等しくなる。
・集成体型の各メンバのアライメントは、そのメンバ自身のアライメントに等しくなる。(要素が構造体の場合は、構造体の中の一番大きなアライメントを持つメンバのアライメントに等しくなる。)
・sizeof(配列) / sizeof(配列を構成している要素)としたときに、配列の要素数を得るために構造体の最後にパティングが挿入される場合がある。
メモ
パディングの計算方法
code:memo
padding = (align - (offset mod align)) mod align
aligned = offset + padding
= offset + ((align - (offset mod align)) mod align)