2016-04-03 25 views
0

重い重量のオブジェクトを作成する可能性のあるライブラリを使用しています。具体的には、私はwaveファイルに関連付けられているオブジェクトを作成しています。オブジェクトが主にスタックまたはダイナミックメモリで構成されているかどうかを検出する方法

Waveオブジェクトのインスタンスを作成する場合(例として)、メモリ内のどこに割り当てられているかを判断する良い方法はありますか?

たとえば、スタック内にstd :: vectorをインスタンス化すると、スタック(ヘッダ情報)にメモリが割り当てられ、実際のコンテナデータがヒープ上に作成されていることがわかります。だから、ほとんどの場合、私はスタックメモリのオーバーフローについて心配する必要はありません。私はまだオブジェクトをヒープで完全にインスタンス化するオプションがありますが。

しかし、オブジェクトの実装についてはわかりません。スタックに大量の配列を作成するライブラリを使用しているとしましょう。これは問題を引き起こす可能性があります。

私の質問:どのようにオブジェクトがメモリ賢明な '重い'を知っているのですか?

+0

短い答えは:できません。少なくとも、あなたがファクトリパートナットを使用しない限り、ヒープ上のオブジェクトを常にインスタンス化します。その場合、答えは常に「ヒープ」です。 –

答えて

3

私はスタックメモリを割り当てる余分な標準的な方法がテーブル(allocaとfriends)から外れていると仮定します。

それが与えられれば、それは簡単です:sizeofオブジェクトを取る。

C++は静的型言語ですが、そのオブジェクトも静的にサイズです。すべての型は、コンパイル時に決定可能でなければならないサイズを持っています。多くのC++はこれに依存しています。だから、あまりにも多くのスタックスペースを占めるオブジェクトについて心配しているのであれば、それはオブジェクトがそのスペースを占有しているからだけである可能性があります。sizeof

そのものをが使用する関数を呼び出すときに問題が発生することはありません。それを検出するために何もできません。しかし、任意の測定によって、与えられたオブジェクトのサイズが "大きく"なるかどうかを知ることができます。

+0

私は参照してください。私は何らかの理由で、オブジェクトのコンストラクタ呼び出しに基づいてサイズが変わるメンバーstd :: arrayを持つオブジェクトを持つことができると考えていました...しかし、配列のサイズは固定しなければならず、変更できませんでした。 – Izzo

関連する問題