Go にはなぜ stackoverflows がないのか 質問する

Go にはなぜ stackoverflows がないのか 質問する

このプレゼンテーションで読んだhttp://golang.org/doc/ExpressivenessOfGo.pdf42ページ:

安全

- スタックオーバーフローなし

これはどうして可能なのでしょうか? また、Go はこれをどのように回避するのでしょうか?

ベストアンサー1

これは「セグメント化されたスタック」と呼ばれる機能です。各ゴルーチンは独自のスタックを持ち、ヒープ上に割り当てられた

最も単純なケースでは、プログラミング言語の実装では、プロセス/アドレス空間ごとに 1 つのスタックが使用され、通常は およびpush(popまたはそれに類似した) と呼ばれる特殊なプロセッサ命令で管理され、固定アドレス (通常は仮想メモリの先頭) から始まるスタック フレームの動的配列として実装されます。

これは高速ですが (以前は高速でした)、特に安全というわけではありません。多数のコードが同じアドレス空間 (スレッド) で同時に実行されると問題が発生します。現在、各コードには独自のスタックが必要です。ただし、スタックが互いに重なったりヒープと重ならないように、すべてのスタック (おそらく 1 つを除く) は固定サイズである必要があります。

ただし、スタックを使用するプログラミング言語は、スタックを別の方法で管理することによっても実装できます。つまり、スタック フレームを保持するが、実際にはヒープ上に割り当てられるリスト データ構造などを使用することです。ヒープがいっぱいになるまでスタック オーバーフローは発生しません。

おすすめ記事