系统相关
首页 > 系统相关> > c – 如何解释内存分配延迟的剧烈跳跃?

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