new有個特殊用法,如下:
base *p = (base*)operator new (sizeof(base));
new (p) base;
其中第二行的意思是將p中的位址中的連續空間當做是base類,然後呼叫base的建構函式。這個new的用法稱之為placement new。
placement new的用途是可以將對於物件的記憶體分配和實際變數值的構建過程分離開。
在stl的allocator和memory庫中,很明顯的使用了placement new的記憶體分配策略。對於container來說,如果要大量的構建物件的話,如果乙個乙個的去分配記憶體和構建的話,時間開銷相對會很大。所以他們裡面的實現都利用了allocator提供的機制來提前分配記憶體,然後在分配的記憶體上面構建物件(也就是呼叫物件的建構函式)。
根據stl的規定,allocator一定要有如下的介面:
static void* allocate(size_t __n, void * = 0);
static void deallocate(void* __p, size_t /* __n */)
void construct(pointer __p, const _tp& __val);
void destroy(pointer __p);
C allocator類學習理解
一般情況下,將記憶體分配和物件構造組合在一起可能會導致不必要的浪費 有些物件可能用不了那麼多的記憶體 在此情況下,我們希望將記憶體分配和物件構造分離。這意味著我們可以按需分配記憶體,但只在真正需要時才真正執行物件的記憶體擴充操作 同時付出一定開銷 常見的容器vector的記憶體分配就是這種方案。po...
C Allocator使用方法
一般情況下,記憶體分配和物件構造組合一起可能會導致不必要的浪費,比如 string const p newstring n 構造n個空string string s string q p while cin s q p n q s 賦予 q乙個新值 const size t size q p 記住我...
學習筆記 雜湊學習筆記
hash基本原理 hash就是乙個像函式一樣的東西,你放進去乙個值,它給你輸出來乙個值。輸出的值就是hash值。一般hash值會比原來的值更好儲存 更小 或比較。那字串hash就非常好理解了。就是把字串轉換成乙個整數的函式。而且要盡量做到使字串對應唯一的hash值。它的主要思路是選取恰當的進製,可以...