8

四分木疎行列クラスを作成しようとしています。つまり、aquadtree_matrix<T>はゼロ行列または の 4 倍(ne, nw, se, sw)ですquadtree_matrix<T>

これはおそらく線形代数演算のパフォーマンスに影響を与えるため、最終的にはさまざまな割り当てスキームをテストしたいと思います。quadtree_matrixしたがって、既存のアロケーターを再利用できるように、標準のアロケーターの型もテンプレート化します。

2 つの異なる種類のデータを割り当てる必要があります: a T、または a のいずれかで、 node4 つのポインター (T またはノードへの) を含みます。私が検討するすべてのアルゴリズムについて、アルゴリズムの任意の時点で直面している部分行列のサイズが何であるかを知っているため、どのような種類のデータが期待されるかを確実に知っています (これらのサイズを保存する必要さえありません)。

もちろん、2 つの異なるアロケーターを使用します。アロケーターの型はテンプレートとテンプレートのコピー コンストラクターを提供するため(標準コンテナーのメンバーがコピーを返すことで提案するrebindように、値の型として使用することを意図しています)、これで問題ありません。get_allocator

問題は、アロケーター メンバー関数が特定のpointer型を使用することです。これはバニラ ポインターである必要はありません。一部のアロケータ (ブースト インタープロセス アロケータ) は、この機能を広範に使用します。

アロケーター ポインターの型がさまざまなポインターである場合、問題はありません。少なくとも、ポインターを使用して void を指定し、それらを正しい型 ( または のいずれnode*T*) に再解釈_キャストすることができます。ユニオンを使用することもできます(おそらくより良いでしょう)。

私の知る限り、allocator::pointer型の PODness に関する要件はありません。これらは、ランダム アクセス イテレータである必要があるだけです。

さて、私の質問は次のとおりです。

アロケータ クラス テンプレートA<T>(またはそれに相当するものA::rebind<T>::other) が与えられた場合、次のことが保証されますか。

  1. 提供された静的キャストの機能A<T>::pointerは、 ?のアクセス可能なベースです。A<U>::pointerUT
  2. 提供された静的キャストの機能A<T>::pointerはアクセス可能なベースであり、キャストの「ランタイム型」(このコンテキストでこれが意味するものは何でも) は?A<U>::pointerTUU
  3. タイプA<void>::pointer(これが理にかなっている場合)?

それとも、私が考えもしなかった問題の解決策はありますか?

4

3 に答える 3

2

20.1.5/2 の表から、 の型A<T>::pointerが「へのポインタ」でなければならないことが明確に示されていますT。これらのポインター型は通常変換可能であるため、1 と 2 は true です。したがって、それは でA<void>::pointerなければなりませんvoid*

編集: 20.1.5/4 にも明示的な文言があります (標準コンテナーがアロケーターについて想定する内容に適用されます):

typedef メンバーの pointer、const_pointer、size_type、および difference_type は、それぞれ T*、T const*、size_t、および ptrdiff_t である必要があります。

于 2011-03-25T16:14:26.660 に答える
0

いいえ、そうではありません。

A<T>::pointer が A<T>::const_pointer および A<T>::void_pointer に変換可能であるという要件がありますが、それが私が見つけることができるすべてです。

A<void>::pointer はvoid*、派手な特別なメモリがない限り、おそらく です。

于 2011-03-25T16:06:41.560 に答える
0

unionaが使用可能であっても、私はまだ使用しないことに注意してください。特に、ここではおそらく何らかの形式の自動メモリ管理 (コンテインがリークしないようにするため) の恩恵を受ける可能性があり、これにはファンシーなクラスが必要です。

したがって、次の 2 段階のアプローチをお勧めします。

  • 指定されたアロケーターを使用して破棄を実行する小さなスマート ポインターを記述します (代わりにdelete)
  • boost::variantポインターで使用する

このようにして、自動メモリ管理compacityの両方を実現できます。

于 2011-03-25T16:31:33.710 に答える