11

タイプの配列に対してリソース割り当てのクローン作成操作を実装していTます。単純な実装では、ソースから新しい配列への呼び出しがnew T[sz]続きます。std::copy記憶を2回歩きます。

生のメモリを割り当ててから使用したいstd::uninitialized_copyので、パフォーマンス上の理由からメモリを1回だけウォークします。カスタムアロケータが使用されている場合(Allocator.allocateその後にstd::uninitialized_copy)、これを実現する方法を知っています。また、(仕様のセクション20.4.1.1で以下std::allocatorを採用している)を使用してこれを実現する方法を知っています。私の懸念は、定義されているタイプでは、ベースのアプローチが間違っているように見えることです。Boost.TypeTraits'を使用してこのような状況を検出できることはわかっています。::operator newlib.allocator.membersstd::allocatorTT::operator newhas_new_operator

オーバーライドされた新しいメモリを尊重する方法で生のメモリを割り当ててから初期化する(そしてメモリを1回だけ渡す)、単純で標準に準拠した方法はありますか?そうでない場合、SFINAEを使用して、newを使用する実装std::allocatorとオーバーライドされた演算子newを使用する実装の間でディスパッチすることは合理的と思われますか?FWIW、Boostを介してgrepすることは、そのようhas_new_operatorな特性の使用を示していません。

ありがとう、Rhys

4

2 に答える 2

4

それは不可能のようです。実装固有の方法で配列サイズを格納する方法のみoperator new[]を知っています (Tデストラクタがある場合) (operator delete[]その後、この情報を利用します)。したがって、新しい式を使用せずに (および要素コンストラクターを呼び出さずに)、この情報を格納する移植可能な方法はありません。

于 2011-10-19T15:24:50.637 に答える
1

新しい配置を試してください。

    typedef std::string T;
    T src[5];
    char* p = new char[sizeof(T)* 5];
    T* dest = (T*)p;
    for(int i = 0;i < 5; ++i)
    {       
        new(dest + i) T(src[i]); //placement new
    }
于 2011-11-25T09:08:02.060 に答える