私のプロジェクトでは、いくつかの STL コンテナーをゼロから作成しています (理由があります)。私はSTLの機能とインターフェースを非常に厳密に模倣しているので、「標準構造と同じ名前であれば、可能な限り標準に準拠する」というポリシーを守るために最善を尽くしています。
もちろん、私のコンテナはテンプレート パラメータとしてアロケータを使用します。これは、いくつかのカスタム割り当てスキームを可能にするので非常に便利です。私の質問に進みます。
このstd::allocator
インターフェイスは、メモリの割り当てをオブジェクトの構築から分離します。同様に、解放と破壊を分離します。どこからメモリを取得するかは、c++ でオブジェクトを適切に構築することと多かれ少なかれ無関係であるため、これは理にかなっています。
したがって、デフォルトの実装では次のような 2 つの構築/割り当て解除関数があります (本から直接引用)。
void construct(pointer p, const T& val) { new(p) T(val); }
void destroy(pointer p) { p->~T(); }
ご覧のとおり、construct は単にplacement new を呼び出し、destroy は単にデストラクタを呼び出します。
配置の新しい構文とデストラクタ構文を使用するだけでなく、これらを使用する理由はありますか? 「正しい」アロケーターはこれらを別の方法で実装できますか? または、標準に準拠するすべてのアロケータ実装に、この方法で実装されたメソッドの構築/破棄があることが保証されていますか?
もっと言えば、コンテナーの要素を構築するためにいつでもstd::uninitialized_copy
andを使用できると言っても過言ではありませんか?std::uninitialized_fill
ありがとう。