2017-10-16 4 views
1

std::vector<std::string>があるとします。階層的に割り当てられたクラスにアロケータを使用する方法

ベクトルのカスタムアロケータを指定しても、私のstd::string -sは引き続き標準の文字列アロケータを使用します。

カスタムアロケータをコンテナとコンテナの両方で共有することはできますか?

+0

私はこの質問が広すぎると思います。単純なクラスにアロケータを使用する方法、階層的に割り当てられたクラスにアロケータを使用する方法、およびアロケータを認識するコンテナを書く方法は、3つの個別の質問があります。これらの3つはすべて自分自身の大きな質問です。あなたが最初の回答を知っていれば、2番目と3番目の質問を別々に提案します。あなたが最初のものへの答えを知らないならば、それについて読むことから始めるべきです(すでに多くの答えがあります)。 –

+1

私は質問が "階層的に割り当てられたクラスのためのアロケータを使用する方法"と思う編集する方法を考えるでしょう。 – Nick

答えて

2

階層型コンテナで使用するアロケータがある場合、標準ライブラリは解決策を提供します:scoped_allocator_adaptor。アダプタを使用すると、そのアロケータは、アロケータ対応のコンテナに下向きに渡されます。これは、コンテナがアロケータ認識特性を正しく専門化し、すべてのコンストラクタが最後にアロケータをとるオーバーロードを必要とすることを必要とします。ここでhttp://en.cppreference.com/w/cpp/memory/scoped_allocator_adaptorからの使用方法の例です:注意する

namespace bi = boost::interprocess; 
template<class T> using alloc = bi::adaptive_pool<T, 
            bi::managed_shared_memory::segment_manager>; 
using ipc_row = std::vector<int, alloc<int>>; 
using ipc_matrix = std::vector<ipc_row, std::scoped_allocator_adaptor<alloc<ipc_row>>>; 

一つは、アロケータはもちろん、容器の種類の一部であるということです。このため、内部コンテナに正しいアロケータタイプを指定する必要がありません。これが行うことは、アロケータインスタンスが確実に渡されることです。これは、ステートレスでないアロケータにとって重要です。この例は続行します:

bi::managed_shared_memory s(bi::create_only, "Demo", 65536); 

// create vector of vectors in shared memory 
ipc_matrix v(s.get_segment_manager()); 

このアロケータはステートレスではありません。

ステートレスアロケータを使用している場合は、これを処理する必要はありません。同じアロケータを使用するアウターコンテナと内部コンテナのタイプを定義するだけです。

ここでは取り上げませんが、もう1つのアプローチは、新しいpmrアロケータのアプローチを使用することです。それは標準に統合されていません。すべてがタイプ・イレースされているので、かなりシンプルになります。ネストされたコンテナに自動的に渡されます。あなたがGoogleのどこかにライブラリの実装を見つけることができます。

2

std :: stringのstd :: vectorがあるとします。どのようにカスタムアロケータを使用できますか?私はベクトルのためのアロケータを行うことができますが、私は同様に文字列のために行う必要がありますか?

コンテナにカスタムアロケータを使用する場合は、アロケータを使用してコンテナにメモリを割り当てるように指示します。

コンテナは、オブジェクトに含まれるオブジェクトの割り当てに責任を負うことはできません。したがって、カスタムアロケータでstd::basic_stringを使用する必要があります。

std :: stringのリンクリストに似た独自のクラスがあるとします。どのようにカスタムアロケータを使用できますか? xmallocなどでmallocを置き換えるといいでしょうか?

また、コンテナは、そのコンテナに割り当てられた割り当てについて責任を負わないでください。代わりに、カスタムアロケータでstd::basic_stringを使用します。ニル・フリードマンの答えが示唆するように更新され、質問に関しては

scoped_allocator_adaptor

は、 scoped_allocator_adaptorは、コンテナとそのcontaineesに同じアロケータを使用するための標準的なソリューションです。

これは、コンテナがコンテナの割り当てに責任があるのではなく、両方が同じアロケータを共有していることを意味します。

+0

申し訳ありませんが、この投稿はほとんど間違っています。多レベルコンテナの割り当ては、既知の問題であり、標準ライブラリ内に解決策があります。あなたが示唆している懸念の分離は良いものではありません。参照:http://en.cppreference.com/w/cpp/memory/scoped_allocator_adaptor –

+0

@NirFriedman、問題についての参考文献へのリンクをいくつか追加できますか? –

+1

私は 'scoped_allocator_adaptor'へのリンクを提供しました。私はそれが十分だと思いますか? –

関連する問題