3

オブジェクト(B)で構成されるリストを持つオブジェクト(A)があります。リスト(B)のオブジェクトはポインタですが、リスト自体をポインタにする必要がありますか? Java から C++ に移行していますが、まだスタック/ヒープに完全に慣れていません。リストはクラス A の外では渡されず、リスト内の要素のみが渡されます。念のため、リスト自体をヒープに割り当てることをお勧めしますか?

また、list(A) を含むクラスもヒープ自体に配置する必要がありますか? リストと同様に、渡されません。

4

5 に答える 5

6

心に留めておいてください

  1. Object-A もスタック上にある場合、リストはスタック上にのみ存在します。
  2. リスト自体がヒープ上にない場合でも、ヒープからストレージを割り当てることができます。これは、std::list、std::vector、およびほとんどの C++ リストがどのように機能するかです。その理由は、スタックベースの要素が大きくならないためです。
  3. 最近では、ほとんどのスタックが約 1 MB であるため、心配する必要がある前に、かなり大きなオブジェクトのかなり大きなリストが必要になります。スタックが約 32kb しかない場合でも、問題になる前に 8,000 近くのポインターを格納できます。

C/C++ での明示的なメモリ管理に慣れていない IMO の人々は、これらのことを考えすぎる傾向があります。

何千ものかなりのオブジェクトがあることがわかっているものを書いていない限り、リストをスタックに置くだけです。関数で巨大な C スタイルの配列を使用していない限り、上記の #1 と #2 により、リストによって使用されるメモリがいずれにしてもヒープになる可能性があります。

于 2009-03-15T02:01:08.387 に答える
1

リストが大きくなる可能性がある場合は、リストをヒープに格納することをお勧めします。ランタイム スタックがどうなるかわからないため、オーバーフローは本当に危険であり、その結果は致命的です。

リストの上限が完全にわかっていて、それがスタックのサイズに比べて小さい場合は、リストを割り当てるスタックを回避できる可能性があります。

于 2009-03-15T01:51:51.840 に答える
0

私は、スタックが小さく、ヒープの断片化を避ける必要がある環境で作業しているため、次のルールを使用します。

  • リストが小さく、既知の固定サイズである場合は、スタックします。

  • リストが小さく、固定サイズが不明な場合は、ヒープと alloca() の両方を考慮することができます。割り当てがそこにある間、関数がヒープに何も割り当てないことを保証できる場合は、ヒープを使用することをお勧めします。これを保証できない場合は、フラグメントを要求しているため、 alloca() を使用することをお勧めします。

  • リストが大きい場合、または拡大する必要がある場合は、ヒープを使用します。断片化しないことを保証できない場合は、トップダウンの割り当てや個別のヒープなど、メモリ マネージャーに組み込みの手段をいくつか用意する傾向があります。

ほとんどの状況では、断片化について心配する必要はありません。その場合、おそらく alloca の使用は推奨されません。

リストを含むクラスに関しては、関数スコープに対してローカルである場合、内部データ構造が極端に大きくない限り、スタックに配置します。

于 2009-03-15T02:00:19.557 に答える
0

「リスト」とはどういう意味ですか。std::list (または std::vector またはその他の STL コンテナー) の場合は、スタックに何も格納されないため、心配する必要はありません。

疑問がある場合は、 sizeof(A) を見てください。これにより、スタック上にあるときにどれだけのメモリが使用されるかがわかります。

しかし...決定は主にオブジェクトの存続期間に基づいている必要があります。スタックベースのオブジェクトは、スコープ外になるとすぐに破棄されます。

于 2009-03-15T02:07:43.020 に答える
-1

スタックは常に最も単純です。残念ながら、これには大きな欠点が 1 つあります。要素の数を事前に把握しておく必要があります。

于 2009-03-15T01:51:35.740 に答える