36

SOに関する多くの質問と回答に関連して、スタックではなく自動ストレージに存在するものとして存続期間が管理されているオブジェクトを参照する方がよいことを学びました。

また、動的に割り当てられたオブジェクトは、ヒープ上にあるとは見なされるべきではなく、動的ストレージ内にあると呼ばれるべきです。

自動、動的、静的ストレージがあることはわかりましたが、自動スタックと動的ヒープの違いを実際に理解したことはありません。なぜ前者が好まれるのですか?

スタック/ヒープの意味やメモリ管理の仕組みについては質問していません。自動/動的ストレージという用語がスタック/ヒープという用語よりも好まれる理由を尋ねています。

4

6 に答える 6

44

自動は、オブジェクトの存続期間について何かを教えてくれます。具体的には、オブジェクトは自動的に囲んでいるスコープにバインドされ、そのスコープが終了すると自動的に破棄されます。

Dynamicは、オブジェクトの存続期間がコンパイラーによって自動的に制御されるのではなく、直接制御されることを教えてくれます。

スタックcallは、コンテナのタイプ、およびcommonおよびinstructionsでサポートされている関連する一般的な命令ポインタプロトコルのオーバーロードされた名前ですret。一般的なスタックフレームの規則により、Cでのオブジェクトの存続期間との履歴の関連付けを除いて、オブジェクトの存続期間については何も教えてくれません。一部の実装では、スレッドローカルストレージはスレッドのスタック上にありますが、単一の関数のスコープに限定されないことにも注意してください。

ヒープもオーバーロードされた名前であり、ソートされたコンテナーのタイプまたはフリーストア管理システムのいずれかを示します。これは、すべてのシステムで利用できる唯一の無料ストアではありません。また、で割り当てられたオブジェクトの存続期間について具体的なことを教えてくれませんnew

于 2012-02-07T19:05:15.277 に答える
10

ほとんどの実装では、スタックを使用して自動ストレージでオブジェクトをバックアップします。これは標準では必須ではありませんが、最近のほとんどのCPUアーキテクチャでうまく機能します。

実装では、さまざまな戦略を使用して、動的な保存期間でオブジェクトをバックアップします。ヒープが現代のメモリアロケータが使用するものを説明するための最良の方法であるかどうかはわかりませんが、それはそのための「歴史的な」用語のようです。

したがって、自動/動的ストレージは、オブジェクトの存続期間を分類(「抽象化」)するために標準で使用される用語です。これらは、標準で説明されているようにオブジェクトについて話したい場合に使用する適切な用語です。
スタックとヒープは、それらをバックアップするために使用できる(「具体的な」)実装手法です。特定の実装について話しているのでない限り、これらの用語を使用することはあまり正しくありません。

于 2012-02-07T18:47:43.927 に答える
7

自動/動的ストレージの用語は、これが標準で要求されているという理由だけで望ましいものです。スタック/ヒープは実装ベースであり、理論的には別の方法で実装できます。

于 2012-02-07T18:43:05.683 に答える
6

技術的に言えば、スタック/ヒープ割り当ては実装の詳細ですが、自動/動的ストレージはより一般的な用語です。標準自体は、アロケータがスタック/ヒープを使用する必要があることを義務付けていません。したがって、自動/動的がより適切な用語ですが、個人的には、その区別は少し過度に衒学的であると思います。

于 2012-02-07T18:47:45.783 に答える
4

「静的ストレージ期間」、「自動ストレージ期間」、および「動的ストレージ期間」という用語は、C++標準に表示されます。

「スタック」および「ヒープ」という用語は、ストレージ期間とはほとんど関係のない標準ライブラリの機能(、、、など)を指すために使用されますstack<>make_heap()push_heap()

于 2012-02-07T18:56:25.050 に答える
1

スタックとヒープは、実装に関連する概念を図に取り入れますが、「自動」と「動的」という用語はより一般的です

于 2012-02-07T18:54:35.757 に答える