繁体   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