簡體   English   中英

std :: allocator如何如此之快?

[英]How is std::allocator so fast?

我認為訪問C ++標准庫的實現是不切實際的,因為它依賴於平台( 如果這句話錯了,請糾正我! )。 好吧,我想在C ++中練習一些非常低級別(至少可以用C ++編程的低級別)。 所以,我開始寫一個Allocator課程,只是為了練習,學習,如果我創造了一些有用的東西,我打算在我的真實項目中使用它。

我的班級看起來還不錯。 它與經典的Base* pointer = new Derivative;一樣快Base* pointer = new Derivative; pointer->~Base(); ::operator delete[] (pointer); 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)是靜態內聯方法。 第一個都分配內存( 僅適用於一個對象)並在此內存位置構造對象(通過使用參數)。 第二個首先破壞對象然后釋放內存位置。 所有三個測試結果(據我調試)完全相同並且有效。 我使用這個循環與這3個單獨的測試(每次一個測試)。

以下是10000000次迭代的結果:
測試1:app。 1.550秒
測試2:app。 1.450秒
測試3:app。 1.200秒
(注意:這些數字是近似數字)

好吧,std :: allocator比兩者都快。 也許沒有太大的區別,但我想知道這種區別的原因。 我對std :: allocator的實現很好奇。 謝謝你的幫助和時間。



附加信息:我在Ubuntu Quantal Quetzal下使用GCC 4.7.2。

您將不得不學習分支預測和CPU流水線,內部實現的低時間復雜度算法,以及緩存一致性,以便進行高度優化。 我不知道std::allocator的實現,但從你的問題來看,我提到的事情是提高性能的領域。

編輯:如果std::allocator使用newdelete類的注釋建議,那么使用一些內存池來制作更具體和優化的分配器非常容易。

std:allocator將保留一個內存池,並且每次調用構造時都不需要進行系統調用每次我們做新的內存由系統分配時

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM