之間的差:什麼是什麼以下兩個分配之間的差值的兩個C++分配方法
for (I = 0; I < 10000000; i++)
P = new CMyObject;
而且
P = new CMyOjbect[10000000];
將分配在第一分配方法原因多個片段和消耗更多的實際記憶?
之間的差:什麼是什麼以下兩個分配之間的差值的兩個C++分配方法
for (I = 0; I < 10000000; i++)
P = new CMyObject;
而且
P = new CMyOjbect[10000000];
將分配在第一分配方法原因多個片段和消耗更多的實際記憶?
其中一個獨立分配10000000個元素。原則上,這些物品可以散佈在整個虛擬內存空間中。另一個分配一個10000000個連續元素的單個數組。
在第一種情況,你必須單獨調用的每個實例delete
(你不能這樣做,所以你有內存泄漏。)在第二種情況下,需要調用delete []
上P
解除分配整個陣列。
這是一個很好的答案,但我不認爲如果這些對象在創建基礎結構之後使用其他類型的內存分配,它確實回答了內存碎片的想法,但很難說不知道對象是什麼。 – Nowayz
每個分配會消耗一些時間並使用(我假設這可能是可以避免的)一些額外的內存。所以方法1肯定會變慢,很可能會使用更多的內存,並可能導致更多的碎片。
在第一種情況下,您正在分配10000000個對象,但在覆蓋之前分配的對象時,只有最後一個對象可用。 --->內存泄漏
在第二種情況下,您分配一個10000000個對象的數組。您可以刪除那些與
delete [] P;
非常真實(很好的發現),但我確定用戶意味着P [I] = new CMyObject; - 對於這個問題我的意思是。 –
是的。
與每個內存分配相關的開銷取決於操作系統以及代碼是否帶或不帶調試符號。
無論如何,每個分配都有正面的開銷。因此,在一個呼叫分配N個對象的開銷比分配一個對象顯着更少的每N次,特別是當N是10000000
請看下面的代碼:
#include <stdlib.h>
#include <iostream>
struct Object
{
Object() : i(0) {}
int i;
};
int N = 1000000;
void test1()
{
Object* p = new Object[N];
}
void test2()
{
for (int i = 0; i != N; ++i)
Object* p = new Object;
}
int main(int argc, char** argv)
{
int i = atoi(argv[1]);
if (i == 1)
{
test1();
}
else
{
test2();
}
std::cout << "Enter a number: ";
std::cin >> i;
return 0;
}
平臺:cygwin32,編譯器:克++不帶調試符號
Memory used for test1: 4,760K Memory used for test2: 16,492K
平臺:Windows 7中,64位,編譯器:Visual Studio 2008中不帶調試符號
Memory used for test1: 4,936K Memory used for test2: 16,712K
平臺:Windows 7中,64位編譯器:Visual Studio 2008的調試符號
Memory used for test1: 5,016K Memory used for test2: 48,132K
還有額外的簿記有工作要做,以確保分配的內存被釋放。這個練習的要點是僅僅演示兩種分配內存方式的開銷成本。
第一個指向CMyObject的10000000個新指針,它們在每次迭代結束後立即泄漏。第二個指向10000000個CMyObjects的數組。 – CoryKramer
第一個泄漏了很多內存。不過,兩者都在尋求麻煩。只需使用一個矢量。 – chris
你不能在第一種分配方法中訪問9999999分配的CMyObjects – yizzlez