1. ホーム
  2. c++

[解決済み] どちらが速いですか?スタックアロケーションとヒープアロケーション

2022-03-18 06:25:22

質問

この質問はかなり初歩的に聞こえるかもしれませんが、これは私が一緒に働いている他の開発者と議論したことです。

私は、ヒープアロケートするのではなく、スタックアロケートできるところはするように気をつけていました。彼は私と話しながら肩越しに見ていて、「性能的には同じだから必要ない」とコメントしました。

私はいつも、スタックを大きくするのは一定時間であり、ヒープ割り当てのパフォーマンスは、割り当て(適切なサイズの穴を見つける)と割り当て解除(断片化を減らすために穴をつぶす、私が間違っていなければ多くの標準ライブラリ実装では削除の際にこの作業に時間がかかるため)の両方についてヒープの現在の複雑さに依存するという印象を抱いていました。

これはおそらく、非常にコンパイラに依存するものだと思います。特にこのプロジェクトでは、私は メトロワークス のコンパイラを使用しています。 PPC アーキテクチャを使用しています。この組み合わせについての洞察は最も有用ですが、一般的に、GCC、およびMSVC++については、どうでしょうか?ヒープ割り当てはスタック割り当てのように高性能ではないのでしょうか?違いはないのでしょうか?それとも、その差はあまりに小さいので、無意味なマイクロ最適化になってしまうのでしょうか。

どうすれば解決するの?

スタックポインタを移動させるだけなので、スタックアロケーションの方がはるかに高速です。 メモリプールを使えば、ヒープアロケーションと同等のパフォーマンスを得ることができますが、これには若干の複雑さとそれ自身の頭痛の種が伴います。

また、スタックとヒープの違いは、パフォーマンスだけでなく、オブジェクトの予想される寿命についても多くのことを教えてくれます。