ホームページ >バックエンド開発 >Golang >Golangのヒープとスタックの違いは何ですか

Golangのヒープとスタックの違いは何ですか

青灯夜游
青灯夜游オリジナル
2023-01-10 17:27:242451ブラウズ

ヒープとスタックの違い: 1. ヒープはプロセスの実行中に動的に割り当てられるメモリ セグメントを格納するために使用され、スタックはプログラムによって一時的に作成されたローカル変数を格納するために使用されます。ヒープメモリのサイクル比 スタックメモリは長くなければならない; 3. ヒープメモリはスタックメモリに比べて、コンパイラによる自動解放ができず、ガベージコレクタによってのみ解放できます。

Golangのヒープとスタックの違いは何ですか

このチュートリアルの動作環境: Windows 7 システム、GO バージョン 1.18、Dell G3 コンピューター。

プログラミング言語には、ヒープとスタックという 2 つの非常に重要な概念があります。

ヒープとスタックは、プログラムを編集するときによく使用される、2 つの非常に重要なデータ構造です。Go 言語も例外ではありません。

これら 2 つのデータ構造を見てみましょう。

スタック

スタックでは、線形テーブルの一方の端にのみデータを入れることができ、データはこの端で取り出されます。 end、つまり、先入れ後出しに従って、後入れ先出しの順序でスタックから要素を削除します。

要素をスタックに入れるプロセスはプッシュと呼ばれます。スタックにプッシュすると、スタック上の要素の数が増加します。スタックに最後に置かれた要素はスタックの一番上にあり、スタックに最初に置かれた要素はスタックの一番下にあります。

スタックから要素を取り出す場合、スタックの先頭からのみ取り出すことができます。要素を取り出すとスタックの番号は小さくなり、最初に入れられた要素が常に取り出されます。最後に入れられた要素が常に取り出されます。最初に取り出されます。

Golangのヒープとスタックの違いは何ですか

#ヒープ

メモリ割り当てにおけるヒープは、部屋にさまざまな家具を配置するのと似ています。家具のサイズは大きい場合も小さい場合もあるため、メモリを割り当てる場合は、家具を配置する前に、家具を収納できる十分なスペースを確保する必要があります。

家具を置いたり置いたりを繰り返すと、部屋の中の空間が乱雑になってしまいますが、この空間に家具を置くと、十分なスペースがあるのに、それぞれの空間がバラバラになってしまいます。 、家具を置くための連続したスペースがありません。現時点では、メモリ アロケータはこれらのスペースを調整して最適化する必要があります。

Golangのヒープとスタックの違いは何ですか

ヒープ割り当てメモリやスタック割り当てメモリと比較して、ヒープは予測できないサイズのメモリ割り当てに適しています。

スタックとヒープの違いは次のとおりです:

  • ヒープ: ヒープはストレージ、メモリに使用されます。プロセスの実行中に動的に割り当てられるセグメント。サイズは固定されておらず、動的に拡大または縮小できます。プロセスが malloc などの関数を呼び出してメモリを割り当てると、新しく割り当てられたメモリがヒープに動的に追加されます (ヒープは拡張されます)。 free などの関数を使用してメモリを解放すると、解放されたメモリはヒープから削除されます (ヒープが削減されます);

    スタック: スタックはスタックとも呼ばれ、一時的に作成されたローカル変数を格納するために使用されます。つまり、関数の中括弧

    { } で定義されたローカル変数です。

  • ヒープ メモリのライフ サイクルは、スタック メモリのライフ サイクルよりも長いです。関数によって返された値が他の場所で使用される場合、この値は、関数によって自動的にヒープに割り当てられます。コンパイラ。

  • スタック メモリと比較すると、ヒープ メモリはコンパイラによって自動的に解放されず、ガベージ コレクターによってのみ解放されます。


#ヒープとスタックの割り当て変数の定義が完了すると、通常、変数はヒープおよびスタック スペース はい。どのスペースが存在するかは、動的メモリ割り当て (new/malloc) があるかどうかによって異なります。

たとえば、次のケースです。

ケース 1

var p *int    //全局指针变量
func f(){
    var i int
    i = 1
    p = &i    //全局指针变量指向局部变量i
}

ケース 2

func f(){
    p := new(int) //局部指针变量,使用new申请的空间
    *p = 1
}

最初のケースでは、var を使用してローカル変数を定義していますが、 i の割り当てによる グローバル ポインタ変数 p を指定すると、関数が終了しても i はこの時点では解放されないため、ローカル変数 i がヒープに適用されます (プログラマが手動で解放します)。

ローカル変数: 関数で定義された変数。動的なライフサイクルがあります。実行されるたびに新しいエンティティが作成され、誰も使用しなくなるまで存続します (たとえば、外部ポインター それを指します。関数が終了するときにこの変数にアクセスするパスはありません) この時点で、それが占有するスペースはリサイクルされます
  • 2 番目のケースでは、new を使用してスペースを適用します、関数を終了すると p が失われるため、関数が解放されるため、p はスタックに適用されます (自動的に解放されます)

[関連する推奨事項:

Go ビデオ チュートリアル

]

以上がGolangのヒープとスタックの違いは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。