2011-05-31 78 views
3

我正在製作一個將要使用許多動態創建對象(光線追蹤)的應用程序。我不是一次又一次地使用[new],而是認爲我只是製作一個簡單的內存系統來加快速度。在這一點上它非常簡單,因爲我不需要太多。新增內存大量增加

我的問題是:當我運行這個測試應用程序,使用我的內存管理器使用的內存正確的金額。但是當我使用[new]運行相同的循環時,它會使用2.5到3倍的內存。有沒有我在這裏沒有看到的東西,或者[新]是否會產生巨大的開銷?

我使用VS 2010 Win7上。此外,我只是使用任務管理器來查看進程內存使用情況。

template<typename CLASS_TYPE> 
class MemFact 
{ 
public: 
    int m_obj_size; //size of the incoming object 
    int m_num_objs; //number of instances 
    char* m_mem; //memory block 

    MemFact(int num) : m_num_objs(num) 
    { 
    CLASS_TYPE t; 
    m_obj_size = sizeof(t); 
    m_mem = new char[m_obj_size * m_num_objs); 
    } 

    CLASS_TYPE* getInstance(int ID) 
    { 
    if(ID >= m_num_objs) return 0; 
    return (CLASS_TYPE*)(m_mem + (ID * m_obj_size)); 
    } 

    void release() { delete m_mem; m_mem = 0; } 
}; 
/*---------------------------------------------------*/ 
class test_class 
{ 
    float a,b,c,d,e,f,g,h,i,j; //10 floats 
}; 
/*---------------------------------------------------*/ 
int main() 
{ 
    int num = 10 000 000; //10 M items 
    // at this point we are using 400K memory 
    MemFact<test_class> mem_fact(num); 
    // now we're using 382MB memory 
    for(int i = 0; i < num; i++) 
    test_class* new_test = mem_fact.getInstance(i); 
    mem_fact.release(); 
    // back down to 400K 
    for(int i = 0; i < num; i++) 
    test_class* new_test = new test_class(); 
    // now we are up to 972MB memory 
} 
+4

您的程序不完整。無論如何,我們可能都不想要這一切。 – 2011-05-31 18:30:17

+0

這是什麼平臺? – 2011-05-31 18:35:03

+0

對不起。我試圖編輯史詩格式失敗,但有人編輯我之前,我想鎖定我的更改。它不喜歡我把它放在那裏的方式 – Veaviticus 2011-05-31 18:36:28

回答

4

內存分配的最小尺寸取決於您使用的CRT。通常這是16個字節。你的對象是12個字節寬(假設是x86),所以你可能在每個分配上至少浪費了4個字節。內存管理器也有它自己的結構來跟蹤什麼內存是空閒的,什麼內存不是 - 這不是免費的。你的內存管理器可能非常簡單(例如,一次性釋放所有這些對象),這本質上會比一般情況下的更有效。

也請記住,如果你正在構建在調試模式下,調試分配器意志墊金絲雀返回分配的企圖雙方檢測到未定義行爲。這可能會將您置於16字節的邊界並進入下一個 - 至少可能是32字節的分配。當您在發佈模式下構建時,這將被禁用。

-2

男孩,我當然希望,沒有人願意從你的內存管理器分配任何非吊艙。或動態大小的對象。並不介意爲每種類型實例化它。或者一次創建儘可能多的喜歡的東西。或者其使用壽命比MemFact長。

實際上,是一個有效的模式,稱爲對象池,與您的類似但不吸引。簡單的答案是,operator new要求是超flexible-它的對象必須永遠活着,直到delete是called-和他們的析構函數也必須被調用,而且必須有完全獨立的,獨立的壽命。它必須能夠隨時分配可變大小的對象以及任何類型的對象。您的MemFact不符合這些要求。對象池也有較少的要求,並且因爲它,明顯比常規new快得多,但它在所有其他方面也不完全失敗。

你試着用橙色的比較幾乎完全腐爛的蘋果。

+0

我說過...它不需要靈活。我使用它作爲2個簡單的類,只要MemFact存在它們就存在。我問的是[新] ...不是我的班級。不需要粗魯。 – Veaviticus 2011-05-31 18:41:41

+1

-1:這不是你說的,它是如何說出來的。 – 2011-05-31 19:36:51

+0

老兄,爲什麼這麼粗魯? – littleadv 2011-06-01 04:18:06