2012-01-10 3 views
1

大きなオブジェクトをスタックに格納するのではなく、ヒープに格納するとどうなるのでしょうか?私はヒープの断片化を制限するためにスタック上に大きなオブジェクトを置くことが望ましいことを読んで覚えています...それは本当ですか? ありがとうヒープ上に大きなオブジェクトを持つことは悪いですか?

編集:質問はテクスチャ、エンティティなどについてのすべての情報を持つ私の基本的なオブジェクトがヒープ上に作成される可能性が高い場所から作っています。そのサイズは、300MBのようなものにすることができます。

+0

大きなオブジェクトではどういう意味ですか、スタックにも制限はありません。 –

+0

本当に大きなオブジェクトはスタックに収まりません。断片化は、サイズ以外の多くの要素によって決まります。 –

+0

もう一つのオプションは、いくつかのメモリを静的に割り当て、大きなオブジェクトをそこに配置することです。 –

答えて

6

一般的にはありません。

これは実装によって異なりますが、多くのシステムでは、スタックのサイズがヒープよりもはるかに制限されています。ヒープに多数の(小さな)オブジェクトが割り当てられていると、通常、ヒープの断片化が問題になります。これはまた、割り当てパターンと割り当て解除によって引き起こされる傾向があります。

1

スタックには制限があることに注意する必要があります。サイズはいくつかの環境で設定できますが、欠点もあります。あなたのオブジェクトが短命である場合、それらはスタックに常駐することができますが、それらを長く保つことができるためには、それらを作成し、関数を呼び出してパラメータとして渡す必要があります。なぜなら、スコープが終了すると、窓。

編集後、300 MBのオブジェクトをスタックに保存する方法はありません。

1

オブジェクトの保存期間は、そのサイズよりも大きくする必要があります。しかし、スタックがかなり制限されているため、大きなオブジェクトを作成することは良い考えではない場合があり、にポインタを置く必要があります。

重要なヒープフラグメンテーションを引き起こすのに十分な大きさのオブジェクトがある場合、またはそれ自体が重要な要素となるほど大きなオブジェクトを持っている場合(正に、これも可能であるとは確信していません)あなたのデザインは正しいのですか?また、オブジェクトがコンテナが使用するストレージよりも小さくなる可能性があり、そのストレージ(std::arrayを除く)がすべて動的に、つまりヒープ上に割り当てられていることにも注意してください。

0

一般に、大きなオブジェクトは、ヒープ上に作成する必要があります。スタックは、通常、特定のスタックコンテキストに関連する小さなオブジェクトに対してのみ使用されます。

関連する問題