0

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 を使用しています。

4

2 に答える 2

1

std:allocator はメモリのプールを予約するため、コンストラクトを呼び出すたびにシステム コールを実行する必要はありません。一方、システムによって新しいメモリが割り当てられるたびに、システム コールを実行する必要はありません。

于 2013-05-10T18:26:13.287 に答える