c – 如何解释内存分配延迟的剧烈跳跃?
作者:互联网
英特尔赛扬847配备8GB内存. (C/C++不是.NET)
这是Windows EC7上唯一运行的线程/函数.
它只需循环分配1MB内存,1000次.
但是,在大约第122次迭代循环之后,将跳转从大约47微秒分配到327微秒所需的时间.
有什么可能的原因可以解释这个给我的老板?
while ( i < ITERATIONS )
{
QueryPerformanceCounter(&li);
start = double(li.QuadPart) / PCFreq;
// allocate 1MB
ptr = new char [1048576]; // 1 byte * 1048576 = 1 MB
QueryPerformanceCounter(&li);
stop = double(li.QuadPart) / PCFreq;
delayAlloc[i] = stop - start;
}
编辑
为了确定,我再次执行了3次测试,每个结果与此非常相似:
解决方法:
让我们简化你的代码并删除时间.
while ( i < ITERATIONS )
{
// allocate 1MB
ptr = new char [1048576]; // 1 byte * 1048576 = 1 MB
}
系统正在为您分配1Mb并返回您的地址.然后你要求另一个,并将新地址存储在你持有前一个地址的同一个变量中.
new返回一个指针,指针实际上只是分配的地址.它不是一个特殊的电子密钥,不是具有范围的对象,它只是内存中分配开始的位置的数值.
当您不再需要内存时,您有责任告诉分配器.无论您是否存储地址数据,都无法知道您对该地址数据的处理方式.
while ( i < ITERATIONS )
{
// allocate 1MB
ptr = new char [1048576]; // 1 byte * 1048576 = 1 MB
delete [] ptr;
}
如果不这样做,在应用程序终止之前,分配的内存将永远不会返回到池中.
这意味着您的应用程序的内存占用量正在增长.在普通的Windows下,这可能不是问题,但是你在Windows的嵌入式风格下运行,其中一个Mb的内存已经是一个很大的数量.第一个122Mb可能预先保留给您的应用程序.但是一旦你分配了你的app开始使用的所有堆,分配器就必须调整它的堆大小才能为你提供额外的分配,而且由于这是嵌入式Windows,因此调整大小是悲观的.
标签:c-3,windows-ce,c,memory,windows 来源: https://codeday.me/bug/20190722/1508029.html