「メモリアライメント」の版間の差分

提供: MonoBook
ナビゲーションに移動 検索に移動
2行目: 2行目:
  
 
この要件は[[コンピューター]]や[[OS]]、[[ミドルウェア]]、[[ライブラリ]]などにより異なります。昨今ではメモリアライメントを[[プログラマー]]がまったく意識しなくても良い環境も存在します。
 
この要件は[[コンピューター]]や[[OS]]、[[ミドルウェア]]、[[ライブラリ]]などにより異なります。昨今ではメモリアライメントを[[プログラマー]]がまったく意識しなくても良い環境も存在します。
 
  
 
例えば、4バイトの整数は4バイト境界、つまりアドレスが4で割り切れる位置に配置されるべきです。
 
例えば、4バイトの整数は4バイト境界、つまりアドレスが4で割り切れる位置に配置されるべきです。
 
アライメントの数字はシステムにより異なります。昨今の[[パソコン]]では4バイト境界が主流であり、[[ビデオカード]]では16バイト境界が主流です。
 
アライメントの数字はシステムにより異なります。昨今の[[パソコン]]では4バイト境界が主流であり、[[ビデオカード]]では16バイト境界が主流です。
  
 +
== メモリパディング ==
 
メモリアライメントを調整するために無駄なデータ(や構造体にダミー変数)を挿入することを「メモリパディング」といいます。例えば4バイト境界の場合、<code>char</code>(1バイト)の後に<code>int</code>(4バイト)が来る場合、<code>char</code>の後に3バイトの無駄なデータ(パディング)を挿入します。これにより、<code>int</code>が4バイト境界に配置されます。
 
メモリアライメントを調整するために無駄なデータ(や構造体にダミー変数)を挿入することを「メモリパディング」といいます。例えば4バイト境界の場合、<code>char</code>(1バイト)の後に<code>int</code>(4バイト)が来る場合、<code>char</code>の後に3バイトの無駄なデータ(パディング)を挿入します。これにより、<code>int</code>が4バイト境界に配置されます。
  

2023年12月22日 (金) 04:48時点における版

メモリアライメントとは、データメモリの特定の位置(通称は特定のバイト境界)に配置されるべきであるという要件を指します。

この要件はコンピューターOSミドルウェアライブラリなどにより異なります。昨今ではメモリアライメントをプログラマーがまったく意識しなくても良い環境も存在します。

例えば、4バイトの整数は4バイト境界、つまりアドレスが4で割り切れる位置に配置されるべきです。 アライメントの数字はシステムにより異なります。昨今のパソコンでは4バイト境界が主流であり、ビデオカードでは16バイト境界が主流です。

メモリパディング

メモリアライメントを調整するために無駄なデータ(や構造体にダミー変数)を挿入することを「メモリパディング」といいます。例えば4バイト境界の場合、char(1バイト)の後にint(4バイト)が来る場合、charの後に3バイトの無駄なデータ(パディング)を挿入します。これにより、intが4バイト境界に配置されます。

一般的にメモリアライメントが正しいとメモリアクセスが高速になりシステム全体のパフォーマンスが向上します。逆を言えばメモリアライメントが無茶苦茶だとアドレス計算のためにパフォーマンスは低下します。

なお、メモリアライメントが正しくないと低速化するどころか正常に動かないシステムも存在します。正しく動かないシステムとしてはDirect3DVulkanなどのグラフィックAPIが有名です。これらは頂点バッファなどのメモリアライメントが正しくないと正常に動きません。なお、AppleMetalはメモリアライメントが無茶苦茶でも動きます。