2016-10-08 42 views
0

我有一個指針向量,我真的需要在程序中繼續執行其他任務之前確保使用的內存是空閒的。我不想依靠操作系統來管理對delete的調用,所以我想自己做,因爲後來我想將這些代碼移到內存有限的嵌入式平臺上。我寫了下面的代碼來測試一個簡單的場景:我選擇了int指針,例如...實際的數據可能是別的!例如一個POD或類刪除矢量中的元素需要永久完成

#include <vector> 
#include <iostream> 
#include <Windows.h> 

#define NUM_ELEMENTS 1000000 

double PCFreq = 0.0; 
__int64 CounterStart = 0; 

void StartCounter() 
{ 
    LARGE_INTEGER li; 
    if (!QueryPerformanceFrequency(&li)) 
     std::cout << "QueryPerformanceFrequency failed!\r\n"; 

    PCFreq = double(li.QuadPart)/1000.0; 

    QueryPerformanceCounter(&li); 
    CounterStart = li.QuadPart; 
} 
double GetCounter() 
{ 
    LARGE_INTEGER li; 
    QueryPerformanceCounter(&li); 
    return double(li.QuadPart - CounterStart)/PCFreq; 
} 

int main() 
{ 
    /***** CREATE VECTOR **********/ 
    std::cout << "Generating " << NUM_ELEMENTS 
    << " elements." << std::endl; 

    StartCounter(); 
    std::vector<int *>* vec = new std::vector<int*>; 
    for (size_t i = 0; i < NUM_ELEMENTS; i++) 
    { 
     vec->push_back(new int(i)); 
    } 

    std::cout << vec->size() << " Have been generated in " 
    << GetCounter() << "ms" << std::endl; 
    std::cout << "Destroying the vector..." << std::endl; 

    /***** DELETE VECTOR **********/   

    StartCounter(); 

    while (!vec->empty()) 
    { 
     delete vec->back(), vec->pop_back(); 
    } 

    vec->clear(); 
    delete vec; 

    std::cout << "It took " << GetCounter() << "ms to empty the vector!\r\n" 
    << "Press ENTER to exit." << std::endl; 

    //wait for key to exit 
    std::cin.get(); 

    return 0; 
} 

這裏是輸出到控制檯:

Generating 1000000 elements. 
1000000 Have been generated in 1077.96ms 
Destroying the vector... 
It took 16834.9ms to empty the vector! 
Press ENTER to exit. 

正如你可以看到它大約需要1秒來填充載體,但它需要幾乎17S擺脫它。

代碼工作,對於1000000個元素,我獲得大約35MB的內存,然後在等待密鑰部分之前開始縮回到大約1MB。但爲什麼這麼慢?我怎樣才能改善這種行爲?

嗯....沒有人關心仔細閱讀我的問題....反正它是視覺工作室玩笨......我跑了程序獨立,它用了不到100ms來填充和刪除矢量!希望此體驗對其他人也有用

+0

爲什麼用'pop_back()'從向量中刪除元素的奇怪方式?你並不需要那樣做。 – juanchopanza

+0

如果我不這樣做,將不會有可見的內存收縮 –

+0

不,'for(auto p:vec)delete p; vec.clear();' – juanchopanza

回答

2

改進很簡單:使用vector<int>而不是vector<int*>,因爲每個指針只存儲一個元素。

如果您的數據較大並且您確實需要存儲指針,請使用unique_ptrboost::ptr_vector。這不是1980年,你可以使用RAII。

至於慢速清理,可能是因爲您的運行時在其小分配結構中有很多條目,並且必須全部找到正確的條目。

如果你需要有一個指針的向量,但需要更快的釋放,建議保持指針的載體,因爲它是和保持實際數據deque樣容器(listarray<data_t,32>,也許?你得做索引保持你自己,但它會加快刪除,如果這是瓶頸)。

+0

謝謝。 int *就是例子,實際的數據可能是一些複雜類型的指針 –

+2

@SaeidYazdani這不是個別動態分配對象的好理由。 – juanchopanza

+2

@SaeidYazdani更具體的原因將是多態接口基指針的向量,即使如此,它們應該是智能指針。 – WhozCraig