C++ の標準ライブラリの実装にアクセスするのは、プラットフォームに依存するため、実用的ではないと思います (この文が間違っていたら訂正してください! )。ええと、C++ の非常に低レベル (少なくとも、C++ でプログラムできる程度の低レベル) について練習したかったのです。それで、私は Allocator クラスを書き始めました。ただ練習して学び、何か役に立つものを作成したら、それを実際のプロジェクトで使用する予定です。
私のクラスは問題ないようです。これは、従来の割り当て、構築、破棄、および割り当て解除ポリシーBase* pointer = new Derivative;
と同じくらい高速です。pointer->~Base(); ::operator delete[] (pointer);
実際、10000000回の反復で、私のクラスは0.1秒遅くなります。
この質問をする理由は、std::allocator です。特定の理由で遅くなる場合もあります。しかし、単に私の実装と比較すると、非常に高速です. 私のコードを観察してください:
int main()
{
for(int x=0; x<10000000; x++)
{
/* TEST 1: Using my Allocator class
A* a = Allocator<B>::construct(10,3.2);
Allocator<A>::destruct(a);
//*/
/* TEST 2: Using operators 'new' and 'delete[]'
A* a = new B(10,3.2);
delete a;
//*/
/* TEST 3: std::allocator
std::allocator<B> allocator;
std::allocator<A> deallocator;
A* a = allocator.allocate(1);
allocator.construct(a,10,3.2);
deallocator.destroy(a);
deallocator.deallocate(a,1);
//*/
}
}
私のコードに関する追加の重要な注意事項:クラス A はクラス B のベースでAllocator<T>::construct(args...)
ありAllocator<T>::destruct(pointer)
、静的インライン メソッドです。最初のものは、( 1 つのオブジェクトだけに十分な) メモリを割り当て、(引数を使用して) このメモリ位置にオブジェクトを構築します。2 つ目は、最初にオブジェクトを破棄し、次にメモリ ロケーションの割り当てを解除します。3つのテストはすべて(私がデバッグした限り)まったく同じ結果になり、機能します。このループを 3 つの個別のテスト (毎回 1 つのテスト) で使用します。
10000000 回の反復の結果は次の
とおりです。 テスト 1: app. 1.550 秒
テスト 2: app. 1.450 秒
テスト 3: app. 1.200 秒
(注: これらの数値はおおよその数値です)
まあ、std::allocator は両方よりもはるかに高速です。大きな違いはないかもしれませんが、この違いの理由を知りたいです。std::allocator の実装にとても興味があります。ご協力いただき、ありがとうございました。
追加情報: Ubuntu Quantal Quetzal で GCC 4.7.2 を使用しています。