真実(少なくとも最新のCPU上では)スタックとヒープは両方ともRAMの単なる部分であるため、同じことを実行するということです。したがって、ポインタの逆参照はほとんど同じです。
違いは、プロセス/スレッド用にスタックが事前に割り当てられているため、malloc
とfree
syscallsを使用する必要はありません。特にmalloc
は高価です。もう1つの違いは、スタックを操作してパフォーマンスを向上させる特定のCPU命令(アセンブリのpush
、pop
など)があることです。しかし、これらは、メモリへのアクセス(レジスタへのメモリのロードなど)とは関係がない可能性があります。
別の違いは、スタックを使い果たした場合、プログラムがクラッシュする可能性が高いことです。あなたがヒープを使い果たした場合、あなたのOSはおそらくスワップを使ってパフォーマンスを何千倍も減らすでしょう。
キャッシュミスはもちろん要因であり、スタック上でヒープ上で頻繁に発生します。しかしこれは単純にヒープがスタックに比べて非常に大きいためです。しかし、あなたが非常にCPUの重いコードを書かない限り、キャッシュミスはそれほど重要ではないことに注意してください。
ここでは、std::vector
が別の時間を参照する必要があるということは間違いありません。しかし、ここでは遅いのは逆参照です。ポインタがスタックやヒープになっているわけではありません。彼らがどこにいるかは関係ありません。ダブル逆参照は、常に単一の場合よりも遅くなります。
スタックとヒープが異なる物理デバイス上に存在する可能性があります。そして、これらの2つのデバイスは、速度が異なります(ヒープが速くなる可能性があります)。しかし、これはやはりスタックとヒープそのものとは無関係です。これはメモリのどの部分にも起こります。そして、あなたは本当にそれについて何もすることはできません。 OSでさえ(まあ、そうかもしれないが、私はそれについてはわからない)。マザーボードのことです。とにかく、マザーボードが速いデバイスをアンダークロックにする可能性も非常に高いです。
真実はありません。それはシステム全体(コードとハードウェア)によって異なります。また、[NUMAマシン](https://en.wikipedia.org/wiki/Non-uniform_memory_access)ではさらに複雑です。本当に知りたい場合は、アプリケーションのプロファイルとテストを行います。 –
エラー、スタックもヒープも物理ドライブに関連付けられていません。 –
メモリアクセスが(通常は物理ドライブ上の)「スワップ」になると、コードはもはや「高速」ではなく、スタックもヒープもなりません。 –