コンパイラがデータ構造のメンバーを整列させるためにデータ構造にパディングを追加する理由について、簡潔で納得のいく説明をしてもらえませんか? CPU がより効率的にデータにアクセスできるようにするために行われることはわかっていますが、なぜそうなるのか理解できません。
そして、これが CPU にのみ関連している場合、なぜ Linux では double が 4 バイトで整列され、 Windows では 8 バイトで整列されるのでしょうか?
ベストアンサー1
アライメントは、CPU がメモリからデータを効率的にフェッチするのに役立ちます。キャッシュ ミス/フラッシュが減り、バス トランザクションなどが減ります。
一部のメモリ タイプ (RDRAM、DRAM など) は、効率的な結果を得るために、構造化された方法 (整列した「ワード」と「バースト トランザクション」、つまり一度に多数のワード) でアクセスする必要があります。これは、次のようなさまざまな理由によります。
- セットアップ時間: メモリデバイスがメモリ位置にアクセスするのにかかる時間
- バス調停のオーバーヘッド、つまり多くのデバイスがメモリデバイスにアクセスしたい可能性がある
「パディング」は、転送効率を最適化するためにデータ構造の配置を修正するために使用されます。
言い換えれば、「不整列」構造にアクセスすると、全体的なパフォーマンスが低下します。このような落とし穴の良い例: データ構造が不整列で、その構造を取得するために CPU/メモリ コントローラが 1 回ではなく 2 回のバス トランザクションを実行する必要があると仮定すると、結果的にパフォーマンスが低下します。