gpt4 book ai didi

变量重新分配中的 C++11 内存释放

转载 作者:太空狗 更新时间:2023-10-29 21:17:19 26 4
gpt4 key购买 nike

我正在尝试了解有关 C++ 中如何处理内存的更多信息,并且我对重新分配变量时如何释放内存有疑问。为了监控内存消耗,我有一个(特定于 Linux 的)函数 CheckMem(),它调用 pmap 来查看进程使用了​​多少内存。然后我简单地创建一个大小为 1 的 vector ,将其重新分配给一个大小为 100 万的 vector ,然后再次将其重新分配为大小 1,然后观察内存如何变化。

#include <iostream>
#include <vector>
#include <sstream>
#include <cstdio>
#include <unistd.h>

using namespace std;

void CheckMem()
{
char cmdstring[100],outbuf[500],buf[100];
sprintf(cmdstring,"pmap -x %d | tail -1",getpid());
FILE* output = popen(cmdstring,"r");
fgets(outbuf,500,output);
size_t kb,rss,dirty;
istringstream ss(outbuf);
ss >> cmdstring >> buf >> kb >> rss >> dirty;
cout << "RSS: " << rss << " KB" << endl;
}

int main()
{
vector<double> vd(1);
CheckMem();
vd = vector<double>(1000000);
CheckMem();
vd = vector<double>(1);
CheckMem();
return 0;
}

如果我用 g++(gcc 版本 4.8.4)编译,我得到以下输出:

RSS: 1184 KB
RSS: 9128 KB
RSS: 9136 KB

当 vector 被重新分配到大小 1 时,用于大 vector (100 万双倍 ~ 8 MB)的内存似乎没有被释放。但是,如果我使用标志 -std=c++11 进行编译,则输出会发生变化:

RSS: 1180 KB
RSS: 9112 KB
RSS: 1300 KB

现在内存似乎被重新分配释放了。 C++11 标准是否以某种方式以不同方式处理重新分配的内存?

最佳答案

库的实现者很可能会重用 vector 的容量,只要它大于您分配给它的 vector 的容量。这样他们就节省了内存分配。

从 C++11 开始,我们有移动赋值,所以当您使用 -std=c++11 编译时,临时 vector 被移动到现有 vector 中,而不是重新使用容量原始 vector 被移动到临时 vector 中。在表达式的末尾,临时对象被销毁,您现在拥有一个容量较小的 vector 。

如果你想缩小 vector 的容量,你应该查看:reduce the capacity of an stl vector

关于变量重新分配中的 C++11 内存释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33177158/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com