0

次の定義に出会いました。

staticオブジェクトは、構築および作成された時点からプログラムの終了まで存在するオブジェクトです。したがって、スタックおよびヒープベースのオブジェクトは除外されます。静的オブジェクトは、プログラムが終了すると破棄されます。つまり、実行が終了するとデストラクタが呼び出されmainます。

スタックおよびヒープベースのオブジェクトが除外されるのはなぜですか???

スタックとヒープについて私が知っていることは次のとおりです。スタックは、実行前にすべての変数が格納されるシステム メモリの一部です。ヒープは、動的に割り当てられたメモリなど、実行時にすべての変数が格納されるシステム メモリの一部です。これは、コードで整数変数を宣言し、iそれに say の値を割り当てると123、コンパイラはコンパイル時 (実行前) に値を認識するため、それがスタックに格納されることを意味します。しかし、ポインター変数を定義し、それを別の場所で初期化したい場合、それはコンパイル時にコンパイラーに認識されないため、ヒープに格納されます。

4

3 に答える 3

1

いくつかの保存期間があります:

  • 静的→プログラム全体の存続期間
  • 自動(スタック)→現在の機能が終了するまで
  • 動的(ヒープ)→明示的に終了するまで(経由delete
于 2011-06-26T10:47:21.807 に答える
0

一般に、静的オブジェクトはコンパイル時にコンパイラーによって「作成」されます。プログラムの終了に関する動作は、言語によって異なる可能性があります。たとえば、Cでは、特別な処理はまったくありません(そして、Objective-Cにも当てはまるAFAIK)。多くの場合、これらのオブジェクトは、コンパイラが作成してプログラムに「接続」した読み取り専用メモリ領域に「存在」します。プログラムがメモリにロードされると、この読み取り専用領域がプログラムのメモリにマップされます。これは非常に高速な操作です。たとえば、printf("I'm a static string.");Cのすべての静的文字列(のように)はそのように扱われます。

次にスタック、別名コールスタック、およびスタックがあります。一般に、スタックは単なるデータ構造、別名LIFO(後入れ先出し)です。コールスタックは実際にOSによって作成され、通常はサイズが制限されています。関数呼び出しに必要なすべての情報が格納されます。つまり、関数呼び出しごとに、その引数とその他の情報がスタックに「プッシュ」され(スタックの一番上に配置され)、関数変数用の小さなスペースが予約されます。関数が戻ると、これらすべてが削除され、戻り値のみが残ります(ただし、これが常に真であるとは限りませんが、多くの場合、戻り値はCPUレジスタに渡されます)。

値をスタックに格納できます。C++などの言語では、オブジェクトをスタックに格納することもできます。それらは、囲んでいる関数が戻ると「自動的に」クリーンアップされます。

スタックに存在するそのようなオブジェクトへのポインタを別の変数に格納することもできます。しかし、おそらくあなたが意味するのは、通常、ヒープ内にオブジェクトを作成し(たとえばnew、Java、C ++、C#などまたはallocObjective-Cで)、そのオブジェクトへのポインターを取得するということです。

最初に戻る:静的オブジェクトはコンパイル時にコンパイラに認識されますが、ヒープとスタックに関係するすべてのことは、定義上、実行時にのみ認識されます。

于 2011-06-26T10:46:03.683 に答える
0

「静的オブジェクトは、構築および作成された時点からプログラムの終了まで存在するオブジェクトです。したがって、スタックおよびヒープベースのオブジェクトは除外されます。」

スタックおよびヒープベースのオブジェクトが除外されるのはなぜですか???

それらは、構築および作成された時点からプログラムの終了まで存在しないため、「除外」されます。

あなたが話しているプログラミング言語によってはニュアンスがあるかもしれませんが、これはあなたが2番目の段落で書いた/理解していることと矛盾しません.


あなたが見つけたのは、言葉遣いが不十分な の定義ですstatic。それ以上でもそれ以下でもありません。

于 2011-06-26T10:38:07.527 に答える