「メモリアライメント」の版間の差分
ナビゲーションに移動
検索に移動
Administrator (トーク | 投稿記録) |
|||
(他の1人の利用者による、間の2版が非表示) | |||
1行目: | 1行目: | ||
− | '''メモリアライメント''' | + | '''メモリアライメント'''とは、ある[[コンピューター]]において[[データ]]が[[メモリ]]の特定の位置(通称は特定のバイト境界)に配置されるべきであるという要件、たとえば「int型が格納されるメモリのアドレスは4で割り切れること」などといった仕様を指します。 |
− | この要件は[[コンピューター]]や[[OS]]、[[ミドルウェア]]、[[ライブラリ]] | + | この要件は[[コンピューター]]や[[OS]]、[[ミドルウェア]]、[[ライブラリ]]などにより異なります。 |
+ | なお、昨今の[[パソコン]]などではメモリアライメントを[[プログラマー]]がまったく意識しなくても勝手にうまいことやってくれるものがほとんどです。一方で[[プログラマブルシェーダー]]では勝手にやってくれないものがほとんどです。 | ||
− | + | 昨今の[[パソコン]]の[[CPU]]では4バイト境界が主流であり、[[ビデオカード]]の[[GPU]]では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バイト境界に配置されます。 | ||
12行目: | 13行目: | ||
なお、メモリアライメントが正しくないと低速化するどころか正常に動かないシステムも存在します。正しく動かないシステムとしては[[Direct3D]]や[[Vulkan]]などのグラフィックAPIが有名です。これらは[[頂点バッファ]]などのメモリアライメントが正しくないと正常に動きません。なお、[[Apple]]の[[Metal]]はメモリアライメントが無茶苦茶でも動きます。 | なお、メモリアライメントが正しくないと低速化するどころか正常に動かないシステムも存在します。正しく動かないシステムとしては[[Direct3D]]や[[Vulkan]]などのグラフィックAPIが有名です。これらは[[頂点バッファ]]などのメモリアライメントが正しくないと正常に動きません。なお、[[Apple]]の[[Metal]]はメモリアライメントが無茶苦茶でも動きます。 | ||
+ | |||
+ | == 関連項目 == | ||
+ | * [[主なグラフィックスAPIのメモリアライメント]] |
2024年4月18日 (木) 01:01時点における最新版
メモリアライメントとは、あるコンピューターにおいてデータがメモリの特定の位置(通称は特定のバイト境界)に配置されるべきであるという要件、たとえば「int型が格納されるメモリのアドレスは4で割り切れること」などといった仕様を指します。
この要件はコンピューターやOS、ミドルウェア、ライブラリなどにより異なります。
なお、昨今のパソコンなどではメモリアライメントをプログラマーがまったく意識しなくても勝手にうまいことやってくれるものがほとんどです。一方でプログラマブルシェーダーでは勝手にやってくれないものがほとんどです。
昨今のパソコンのCPUでは4バイト境界が主流であり、ビデオカードのGPUでは16バイト境界が主流です。
メモリパディング[編集 | ソースを編集]
メモリアライメントを調整するために無駄なデータ(や構造体にダミー変数)を挿入することを「メモリパディング」といいます。例えば4バイト境界の場合、char
(1バイト)の後にint
(4バイト)が来る場合、char
の後に3バイトの無駄なデータ(パディング)を挿入します。これにより、int
が4バイト境界に配置されます。
一般的にメモリアライメントが正しいとメモリアクセスが高速になりシステム全体のパフォーマンスが向上します。逆を言えばメモリアライメントが無茶苦茶だとアドレス計算のためにパフォーマンスは低下します。
なお、メモリアライメントが正しくないと低速化するどころか正常に動かないシステムも存在します。正しく動かないシステムとしてはDirect3DやVulkanなどのグラフィックAPIが有名です。これらは頂点バッファなどのメモリアライメントが正しくないと正常に動きません。なお、AppleのMetalはメモリアライメントが無茶苦茶でも動きます。