2012-03-18 67 views
3

自定義分配器,特別是定製allocate/deallocate方法的能力非常有用 - 可以控制某些性能關鍵區域中使用的低級內存分配策略。基於節點的容器的Pooled allocators,以及fixed-size allocators是一些想到的例子。何時在分配器中使用自定義構造/銷燬方法有用?

但是什麼時候定義自定義construct/destroy方法很有用?

據我瞭解,該標準規定,這些方法具有作爲安置new和明確的破壞,即同樣的效果:

//construct should give the same effect as: 
    construct (_Type *_ptr, _Type const&_val) 
    { 
     new(_ptr) _Type(_val); 
    } 
//destroy should give the same effect as: 
    destroy (_Type *_ptr) 
    { 
     _ptr->~_Type(); 
    } 

有什麼辦法來實現以另一種方式這些方法 - 不使用位置new和明確的破壞?如果不是,他們爲什麼是分配器對象的一部分?如果每個人都直接使用new放置和直接銷燬,這難道不會更容易嗎?

+2

'構造函數也許可以做*別的*除了*新的位置。這是一個定製點,如果你需要它,這是一件好事。 – 2012-03-18 04:34:15

+0

@BoPersson:有什麼「別的東西」會是一個實際的例子嗎?我還沒有想出任何不會更好地放置在實際對象類型本身的'ctor/dtor'中的......另外,如果'construct/destroy'確實做了與普通對象創建/銷燬不同的事情,在堆棧上創建的本地對象的行爲將與通過分配器創建的行爲不同。這是否合理? – 2012-03-18 04:45:03

+0

這是在分配器中具有此功能的一個原因。當容器存儲在共享內存中時,可能需要特殊的* *。它*允許包含的對象與堆棧對象不同。 – 2012-03-18 04:49:02

回答

0

對於在模板參數周圍替換包裝類型並對其進行操作的分配器,constructdestroy應調用包裝器構造函數和析構函數,而不是分配類型。

在C++ 11中,construct將任意數量的參數轉發給構造函數。自定義分配器可以在列表的開始或結尾插入參數,或者截取和修改參數。不過,這隻在用戶使用就地建造時纔有效。

順便說一句,你不應該使用_Type作爲標識符;前導下劃線後跟大寫的標識符被保留用於執行。

相關問題