2012-04-03 7 views
0

scoped_ptrは、あるスレッド内のすべてのオブジェクトがスタック状に割り当てられていることを保証しているため、オブジェクトの「カスタムヒープ」を指定するのが最も難しい方法は、scoped_ptrですか?
(例えばなどvector秒、deque秒、string秒、用)scoped_ptr内のオブジェクトの割り当てが非常に高速ですか?

(これは、スタックとほぼ同じ速さでプールを取得し、私たちはほぼ完全にオーバーヘッド伝統的なヒープを避けるためにできるようになるが、同じ大きさヒープとして)

+1

scoped_ptrは割り振り戦略について何も保証しません。範囲外になると、それはdeleterを呼び出します。 –

+0

@CoryNelson:コピーや移動ができないことも保証されていますか?これは、ポインタが明示的にエスケープされていない限り(プログラマの失敗であり、簡単に避けられない)、2つの 'scoped_ptr'は、それらが作成された逆の順序で破棄されなければならないことを意味します。 – Mehrdad

+2

@Downvoter:マインドの説明は? – Mehrdad

答えて

3

scoped_ptrとスマートポインタは一般に、には、オブジェクトに割り当てられたメモリに割り当てられた効果がありません()。なんらかの理由でscoped_ptr<std::vector<T> >がある場合は、にstd::vector<T>*が格納されていることは、std::vector<T>がそのメモリを取得する場所とはまったく関係ありません。

もちろん、std::vector<T>が既に他の標準ライブラリクラスと同様にRAIIタイプであるという事実は、それ自体をクリーンアップするということは、scoped_ptrに貼り付けることは意味がないことを意味します。

要するに、あなたが話していることは、scoped_ptrとまったく関係がありません。コンテナクラスに使用するアロケータと関係があります。あなたは間違った木を吠えている。

+0

さて、あなたは*これに割り当てるアロケータはありませんか? 'scoped_ptr'のようなクラスの中で' operator-new'のオーバーロードトリックを使う方法はないのでしょうか、それともそのようなものに基づいてグローバルメモリアロケータを一時的にフックするのでしょうか?アロケータは* one *ソリューションだと理解していますが、それらは*唯一の(または最も簡単な/最も簡単な)ソリューションですか? – Mehrdad

+0

@Mehrdad: 'scoped_ptr'は* magic *ではありません。それは、ポインタを格納し、要求したときにそれを与えてから、デストラクタで削除するだけです。それはそれが実際に何を格納しているのか、それ以上の知識はありません。標準ライブラリコンテナのメモリがどこから来るかに影響を与える方法は、アロケータを使用することです。代わりの方法はありません。 'operator new'を使用しないので、' operator new'のオーバーロードは助けになりません。彼らはアロケータを使います。 –

+0

はい、私はすでに 'scoped_ptr'が何をしているのかは知っていますが、あなたが不必要に問題を過剰に制限しているようです。 'scoped_ptr'を内部的に使用する新しいクラスを作ることはできません。例えば、オブジェクトを割り当てますか?または、 'scoped_ptr'のコードを取って少し微調整して動作させることはできませんか?なぜあなたが質問をそんなに制限したのか分かりません。 – Mehrdad

関連する問題