2017-11-25 10 views
4

私はそのことについて意見が矛盾していると聞いてきました。ヒープに割り当てられたデータは、スタックに割り当てられたデータよりもアクセスに時間がかかりますか?

std::vectorまたはmallocによって割り当てられたダイナミックアレイのヒープに割り当てられたデータへのアクセスは、そのデータにアクセスするために常に中間ポインタを経由する必要があるため、おそらくメモリの全く異なる領域に位置する可能性があります。他方では、スタック上に割り当てられたデータにアクセスすることは、この中間ポインタを通過する必要がなく、このデータは既にキャッシュされている可能性が高い。

他の人は、ヒープ上では(オーバーヘッドがmalloc,mmapなどのためオーバーヘッドのために)スタックよりもデータの割り当てが遅いと主張しますが、スタックとヒープ異なる物理ドライブに配置されています。

真実は何ですか?

+1

真実はありません。それはシステム全体(コードとハードウェア)によって異なります。また、[NUMAマシン](https://en.wikipedia.org/wiki/Non-uniform_memory_access)ではさらに複雑です。本当に知りたい場合は、アプリケーションのプロファイルとテストを行います。 –

+3

エラー、スタックもヒープも物理ドライブに関連付けられていません。 –

+0

メモリアクセスが(通常は物理ドライブ上の)「スワップ」になると、コードはもはや「高速」ではなく、スタックもヒープもなりません。 –

答えて

2

真実(少なくとも最新のCPU上では)スタックとヒープは両方ともRAMの単なる部分であるため、同じことを実行するということです。したがって、ポインタの逆参照はほとんど同じです。

違いは、プロセス/スレッド用にスタックが事前に割り当てられているため、mallocfree syscallsを使用する必要はありません。特にmallocは高価です。もう1つの違いは、スタックを操作してパフォーマンスを向上させる特定のCPU命令(アセンブリのpushpopなど)があることです。しかし、これらは、メモリへのアクセス(レジスタへのメモリのロードなど)とは関係がない可能性があります。

別の違いは、スタックを使い果たした場合、プログラムがクラッシュする可能性が高いことです。あなたがヒープを使い果たした場合、あなたのOSはおそらくスワップを使ってパフォーマンスを何千倍も減らすでしょう。

キャッシュミスはもちろん要因であり、スタック上でヒープ上で頻繁に発生します。しかしこれは単純にヒープがスタックに比べて非常に大きいためです。しかし、あなたが非常にCPUの重いコードを書かない限り、キャッシュミスはそれほど重要ではないことに注意してください。

ここでは、std::vectorが別の時間を参照する必要があるということは間違いありません。しかし、ここでは遅いのは逆参照です。ポインタがスタックやヒープになっているわけではありません。彼らがどこにいるかは関係ありません。ダブル逆参照は、常に単一の場合よりも遅くなります。

スタックとヒープが異なる物理デバイス上に存在する可能性があります。そして、これらの2つのデバイスは、速度が異なります(ヒープが速くなる可能性があります)。しかし、これはやはりスタックとヒープそのものとは無関係です。これはメモリのどの部分にも起こります。そして、あなたは本当にそれについて何もすることはできません。 OSでさえ(まあ、そうかもしれないが、私はそれについてはわからない)。マザーボードのことです。とにかく、マザーボードが速いデバイスをアンダークロックにする可能性も非常に高いです。

0

いくつかのプロセスが常に中間ポインタを経なければならないので、ヒープ(malloc関数によって割り当てられたつまりはstd ::ベクトルまたは動的な配列)に割り当てられたデータへのアクセスは、常にスタックに割り当てられたデータにアクセスするよりもわずかに遅いことを言いますメモリの全く異なる領域に位置する可能性の高いデータにアクセスする。他方では、スタック上に割り当てられたデータにアクセスすることは、この中間ポインタを通過する必要がなく、このデータは既にキャッシュされている可能性が高い。

これはウシ糞便廃棄物です。中間ポインタレジスタなしでは、静的にしかアクセスできません。スタックデータは、補助スタックレジスタ(例えば、BP、AP)を有するいくつかのプロセッサを有するレジスタ(SP)を介したアクセスである。

また、メモリはメモリです。メモリをスタックにする唯一の考えは、スタックとしてアクセスされるということです。

その他のデータのみ割り当てが(なぜならのmalloc、MMAPと同様の機能のオーバーヘッドの)スタックよりもヒープに低速であると主張するが、アクセスはこれが正しいない

あります。スタックにデータを割り当てるには1つの命令しか必要ありません。

関連する問題