簡體   English   中英

__int64 vs int-內存管理

[英]__int64 vs int - Memory Managed

我有一台Win XP 32位計算機。 我正在使用Visual C ++語言測試這種情況。 我創建了一個類似於vector <__ int64> v的向量。 我記下虛擬內存,現在說400 KB。 然后,我向其中推入約500萬個整數。 現在我注意到虛擬內存,它增加到大約900 KB。 現在,我將向量稱為擦除或清除。 現在,我檢查虛擬內存的600 KB。

我用int v的vector嘗試相同的情況。 這次我在填充向量之前和刷新向量之后獲得了確切的內存量。

為什么內存之間有區別?

注釋:使用 SmartHeap

除了回答內存並不總是釋放到操作系統之外,測試還可能受到以下事實的影響:擦除向量中的元素或清除向量不會減小向量所分配的緩沖區的大小。

為了保證釋放內存,請確保向量超出范圍,或使用臨時向量:

{
    std::vector<__int64> temp;
    v.swap(temp);
}

運行時不會總是將內存釋放回操作系統,而是會保留內存,以備將來需要時使用。 有時,內存也相當分散,因此沒有簡單的方法將其釋放回操作系統。

分配器通常會以(大於程序分配的)塊的形式保留內存,因此查看內存使用情況可能無法反映程序的內存分配和釋放。

無論如何,它們都是虛擬內存,因此與耗盡計算機的物理內存無關緊要。

主要原因是內存碎片,不允許運行時釋放所有虛擬內存。 您應該考慮將自定義分配器用於如此大的分配。 查看boost :: pool_alloc作為自定義分配器的一個很好的實現。

使用池使您可以更好地控制程序中內存的使用方式。 例如,您可能會遇到這樣的情況,您希望一次分配一堆小對象,然后到達程序中不再需要它們的一點。 使用池接口,您可以選擇運行它們的析構函數,或者只是將其丟棄。 池接口將確保沒有系統內存泄漏。

伙計們,我在這里遇到了問題。

對於__int64如果我首先為向量保留一些字節,然后執行插入操作,然后清除向量,則會得到原始內存。 但是,令我困惑的是,為什么對於int的法線向量不需要此方法。

暫無
暫無

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

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