ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

c – 如何解释内存分配延迟的剧烈跳跃?

2019-07-23 00:07:08  阅读:279  来源: 互联网

标签:c-3 windows-ce c memory windows


英特尔赛扬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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有