アライメント
#TODO
アライメント(alignment、境界調整)
メモリやストレージなどの記憶装置にデータを書き込む際、書き込むデータの大きさや先頭の位置(アドレス)を、装置の管理単位(ワード)の整数倍になるように調節すること
ref: https://e-words.jp/w/アライメント.html
特定の型のオブジェクトを特定のバイトアドレスの倍数のアドレスをもつ記憶域境界に割り付ける要求。
ref: JIS X 3010:2003
アライメントという言葉はかなり理解しにくく感じるので、できるだけ境界調整という言葉を使った方が良いと思う
CPUによっては境界調整に寛容だったり厳しかったりする
RISCの場合、境界調整の制約は厳しい
CISCの場合、境界調整の制約は緩い
Intelのx86、x86_64のCPUとか
C++11にはaligned_alloc()がある
アライメントをきちんと調べるには__alignof__、offsetofを駆使して調べる
C言語のchar、short、int、long、long long、float、double、long double、ポインタ型のアライメントについて
下記はLinux(x86) + gccで実施した場合
table:32bitの場合(ILP32, x86のデータモデル)
型 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バイト
table:64bitの場合(LP64, x86のデータモデル)
型 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バイト
構造体、共用体のアライメント計算
関連
ワード(メモリ)
JIS X 3003
エンディアン
32ビットデータモデル
64ビットデータモデル
確認用
Q. アライメントとは
Q. アライン
Q. なぜアライメントが必要なのか
Q. データ整列
Q. メモリアライメント
Q. データ構造パディング
Q. アライメントを守るとは
Q. アライメントを調整するとは
Q. アライメントの例
Q. ワード境界
Q. キャッシュライン境界
Q. データアライメント
参考
アライメント(アラインメント)とは - 意味をわかりやすく - IT用語辞典 e-Words
データ構造アライメント - Wikipedia
【C言語】 メモリアライメント を全力でわかりやすく説明する | hirokuma.blog
★データ型のアラインメントとは何か,なぜ必要なのか?
最近のコンピュータはバイトマシンらしい
アライメントは、何バイト境界にアラインすればよいか
アラインメントは CPU のハードウェアに起因する問題であり, データのメモリアドレスに関する制約である.
構造体の格納とアラインメント | Microsoft Learn
・基本的にプリミティブ型の変数は、そのデータ型のサイズのアライメントを持つ。(ただし、このサイズがデータバスより大きい場合はデータバスのサイズになることが多い。例えば、僕の32bit環境の8byteであるdoubleのアライメントは4byteだった。)
・配列や構造体といった集成体型のアライメントは、そのデータ型が持つメンバの中で最も大きなアライメントを持つものと等しくなる。
・集成体型の各メンバのアライメントは、そのメンバ自身のアライメントに等しくなる。(要素が構造体の場合は、構造体の中の一番大きなアライメントを持つメンバのアライメントに等しくなる。)
・sizeof(配列) / sizeof(配列を構成している要素)としたときに、配列の要素数を得るために構造体の最後にパティングが挿入される場合がある。
【C言語】アライメントについて【便利なマクロあり!】 - FromNandの日記
BohYoh.com-C/C++ FAQ 境界調整とは何ですか。
メモ
データ構造アライメント - Wikipedia
パディングの計算方法
code:memo
padding = (align - (offset mod align)) mod align
aligned = offset + padding
= offset + ((align - (offset mod align)) mod align)
コンピュータアーキテクチャの話(117) データタイプとアライメント(1) | TECH+(テックプラス)
コンピュータアーキテクチャの話(118) データタイプとアライメント(2) | TECH+(テックプラス)
境界調整(アラインメント)を調べる::実装技術
malign-double
linux - doubleを-malign-doubleオプションで8バイトアラインメントにするメリットはなんでしょうか? - スタック・オーバーフロー
位置合わせモードの使用 - IBM Documentation
offsetof
付録 C ISO/IEC C 99 の処理系定義の動作 (Oracle Solaris Studio 12.2: C ユーザーガイド)
#メモリ #C/C++