問題タブ [allocator]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - uninitialized_copy / fill(最初に、最後に、destの場合、A&a)は、C ++標準の見落としですか?
私は物事がどのように機能するかを知りたいので、c++標準ライブラリを深く掘り下げてきました。先日、何かが起こった。
包含者(例:)はstd::vector<int, std::allocator<int> >
、割り当てに指定されたアロケータを使用する必要があります。具体的には、標準は次のように述べています。
23.1.8
この句で定義されているすべてのコンテナタイプのコピーコンストラクタは、それぞれの最初のパラメータからアロケータ引数をコピーします。これらのコンテナタイプの他のすべてのコンストラクタは、値型がコンテナの値型と同じアロケータであるAllocator&引数(20.1.5)を取ります。この引数のコピーは、各コンテナーオブジェクトの存続期間中に、これらのコンストラクターおよびすべてのメンバー関数によって実行されるメモリ割り当てに使用されます。この句で定義されているすべてのコンテナタイプで、メンバーget_allocator()は、コンテナの構築に使用されるAllocatorオブジェクトのコピーを返します。
また、標準の後半では、次のようになっています(いくつかの異なる場所で、1つを選択します)。
効果:指定されたアロケータを使用して、値のコピーがn個ある両端キューを作成します。
OK、それでは私の質問に移ります。
std::vector
例として、次のようなものを実装するための自然で効率的な方法を見てみましょう。
次のようになります。
具体的には、メモリを割り当ててから、すべてのメンバーをコピーして配置します。new value_type[x.size()]
デフォルトでは、配列を上書きするためだけに配列を作成するため、このようなことをわざわざ行う必要はありません。
しかし、これはコピー構築を行うためにアロケータを使用しません...
次のようなループを手動で作成できます。
しかし、それは無駄であり、ほぼ同じですstd::uninitialized_copy
。唯一の違いは、新しい配置の代わりにアロケータを使用することです。
したがって、標準に次のような(私には明らかなように見える)一連の関数がないことは見落としだと思いますか?
これらのタイプの関数は(手動で実装するのは簡単ですが...例外安全にしようとするまで)、独自のコンテナーなどを実装してコピー構造を効率的に使用したい場合は、かなり役立つと思います。アロケータを使用している間。
考え?
c++ - scoped_ptr 内のオブジェクトの割り当てが非常に高速ですか?
特定のスレッド内のすべてのオブジェクトがスタックのような方法で割り当てられることが保証されているためscoped_ptr
、オブジェクトの「カスタム ヒープ」を指定する最も簡単な方法は何scoped_ptr
ですか?
(例: vector
s、deque
s、string
s など)
(これにより、従来のヒープ オーバーヘッドをほぼ完全に回避でき、スタックとほぼ同じ速度でヒープと同じ大きさのプールを取得できます。)
memory - カスタムLuaアロケータを使用してメモリ使用量をカウントしますが、その結果はcollectgarbage('count')とは異なります。
最近、プロジェクトでluaのメモリ使用量を追跡しようとしていますが、このタスクにlua_Allocカスタムアロケータを使用するというアイデアに出くわしました。まあ、アロケータコードは簡単に見えます、そしてそれはうまくいくようです。
しかしすぐに、この小さな関数は2つの課題に直面しました。1。
出力される結果は、collectgarbage('count')によって与えられる値とはかなり異なります。
2.現在のメモリ使用量がMバイトであると仮定し、いくつかのnil参照を入力してgcを呼び出すと、メモリ使用量はMバイトより大きくなります。例:A return、B return、C return、...、collectgarbage()
さて、luaを正しく使えばmem-leakはないと聞いたので、メモリ使用量のカウントで何かおかしなことをしていたと思います。私がそれを理解するのを手伝ってください。前もって感謝します。
コンパイル可能なコードは以下に添付されています:
#2に関する入力シーケンス:
c++ - アロケータクラスを使用したベクトルの実装
これは、ベクトルクラスの実装です。これは、関数reserve()で大きくなるT型の動的配列を使用します。アロケータクラスを使用して実装した場合はどうなりますか?(予約関数だけでなく、ベクトルクラス全体)
これは、ファイルstl_vector.hでどのように表示されるかを示しています。
c++ - std :: vectorはどのようにオブジェクトを割り当てますか?
オブジェクトをどのようにstd::vector
割り当てますか?まるでstd::allocator::allocate
メモリのブロックを作成するために使用しているように見えますが、それからを呼び出すことはありませんstd::allocate::construct
。これは本当ですか?std::vector
メモリを割り当てるだけで、メモリ割り当てとしてオブジェクトを構築することはありませんか?
デフォルトのコンストラクターがない場合はどうなりますか?オブジェクトにデフォルトのコンストラクターがない場合、コンストラクターはどのように呼び出されますか?複数のパラメーターがある場合はどうなりますか?
たとえば、このコードにはデフォルトのコンストラクターはなく、std::allocatorで許可されています。
c++ - 高速std::wstring割り当て用のカスタムアロケータ
このブログ投稿に示されているような高速割り当てパターンのstd::wstring
実装に使用できるオープンソースアロケータ(おそらくBoostにある)はありますか?
Boost.Poolは、この目的にはあまり適していません。
c++ - Boost 高速プール アロケータは関数ポインタに問題がありますか?
これはブーストのバグですか、それとも何か間違っていますか?
最後の行は、Boost 1.40 および 1.48 を使用する MS Visual Studio 2008 でコンパイルできません。ただし、g++ 4.5.3 (Cygwin) では正常にコンパイルされます。
エラーは次のとおりです。
c++ - std::allocator::construct と std::allocator::destroy が要素型でテンプレート化されるのはなぜですか?
std::allocator
construct
およびdestroy
メンバー関数は、構築する要素の型でパラメーター化されます。
これの根拠は何ですか?なぜ彼らはどちらかを取らないのですvalue_type*
かpointer
?allocator<T>
type のオブジェクトを構築または破棄する方法のみを知っている必要があるようT
です。
memory-management - OpenCV のカスタム メモリ アロケータ
OpenCV 2.3.1 のカスタム アロケータを設定することは可能ですか? 私はメモリプールを作成しており、OpenCV でそのプールを必要に応じて使用したいと考えています。
それは可能ですか?もしそうなら、どうすればそれを行うことができますか?
更新しました:
前回の回答からいくつかの開発を行いましたが、まだいくつかの問題があります。これは私が今持っているコードです:
さて、私の質問は、割り当てたいデータへのサイズとポインターにアクセスし、後で割り当てを解除するにはどうすればよいですか?
私が使用している OpenCV のバージョン (2.3.1) は、cvSetMemoryManager を使用するとエラーをスローします。その理由はソースコードにあります:
これにはとてもがっかりしました。OpenCV でカスタム メモリ プールを使用することはもうできないと思います。
c++ - std 型が、アロケーターが異なるソースからの変換コンストラクター/代入を提供しないのはなぜですか
たとえば、なぜtemplate< typename Elem, typename Traits, typename Alloc > basic_string { ... }
提供しないのか:
両方のアロケーターを尊重するような変換コンストラクターを実装することは、かなり簡単に思えます。現在の状況では、アロケーターが異なるだけで型間のインターフェイスを作成するのは非常に面倒です。