9

アロケーターがステートレスであるとはどういう意味ですか? std::allocator は malloc のラッパーであり、独自の状態を持たないことに気付きました。同時に、malloc は独自の簿記を行うため、すべての std::allocator インスタンスが単一の状態を利用していると言えます。

状態なしでプール アロケータを実装するにはどうすればよいですか? アロケーターでない場合、メモリの現在の状態を維持するものは何ですか?

このコンテキストで状態が何を意味するかを誰かが正式に定義できますか?

4

2 に答える 2

7

状態とは、クラスのインスタンスに変更可能な情報があることを意味します。ステートレスとは、それを持っていないことを意味します。ステートレス クラスには、非静的データ メンバーはありません。

そのタイプのすべてのプール アロケーターに同じ相互外部状態 (プール) を使用することで、プール アロケーターをステートレスにすることができます。

于 2012-09-22T15:29:57.890 に答える
3

アロケータ オブジェクト自体をステートフルにすることはお勧めしません。これは、(または独自の) インスタンスを作成する場合std::allocator、このインスタンスに割り当てられたブロックなどに関する情報を含めないことを意味します。この情報は、すべてのインスタンスstaticで共有する必要があります。std::allocatorこのルールを破ると、STL ライブラリで未定義の動作が発生する可能性があります。

たとえば、次を見てください。std::list::splice一方から要素の間隔を削除し、他方std::listに挿入します。含まれている要素に対して実際には何も行われません (コピーなどはありません)。このメソッドは、内部ポインターを再配置するだけです。では、std::allocatorインスタンス #1 (リスト #1 内) が何かを知っている場合、std::allocatorインスタンス #2 (リスト #2 内) を知らないものは何ですか? これらの要素は、失われたり、メモリリークしたり、自発的に削除されたりします..

STL に関するそのようなことについての良い読み物は、"Effective STL"、Scott Meyers です。

于 2012-09-23T18:29:43.377 に答える