メモリアライメント
メモリアライメントとは、あるコンピューターにおいてデータがメモリの特定の位置(通称は特定のバイト境界)に配置されるべきであるという要件、たとえば「int型が格納されるメモリのアドレスは4で割り切れること」などといった仕様を指します。
この要件はコンピューターやOS、ミドルウェア、ライブラリなどにより異なります。
なお、昨今のパソコンなどではメモリアライメントをプログラマーがまったく意識しなくても勝手にうまいことやってくれるものがほとんどです。一方でプログラマブルシェーダーでは勝手にやってくれないものがほとんどです。
昨今のパソコンのCPUでは4バイト境界が主流であり、ビデオカードのGPUでは16バイト境界が主流です。
メモリパディング[編集 | ソースを編集]
メモリアライメントを調整するために無駄なデータ(や構造体にダミー変数)を挿入することを「メモリパディング」といいます。例えば4バイト境界の場合、char
(1バイト)の後にint
(4バイト)が来る場合、char
の後に3バイトの無駄なデータ(パディング)を挿入します。これにより、int
が4バイト境界に配置されます。
一般的にメモリアライメントが正しいとメモリアクセスが高速になりシステム全体のパフォーマンスが向上します。逆を言えばメモリアライメントが無茶苦茶だとアドレス計算のためにパフォーマンスは低下します。
なお、メモリアライメントが正しくないと低速化するどころか正常に動かないシステムも存在します。正しく動かないシステムとしてはDirect3DやVulkanなどのグラフィックAPIが有名です。これらは頂点バッファなどのメモリアライメントが正しくないと正常に動きません。なお、AppleのMetalはメモリアライメントが無茶苦茶でも動きます。