【发布时间】:2020-02-10 03:38:41
【问题描述】:
我一直在测试我自己的一些代码,以查看耗尽堆或空闲存储上的内存需要多少分配的内存。但是,除非我的代码在测试中是错误的,否则我会在堆上放置多少内存方面得到完全不同的结果。
我正在测试两个不同的程序。第一个程序在堆上创建向量对象。第二个程序在堆上创建整数对象。
这是我的代码:
#include <vector>
#include <stdio.h>
int main()
{
long long unsigned bytes = 0;
unsigned megabytes = 0;
for (long long unsigned i = 0; ; i++) {
std::vector<int>* pt1 = new std::vector<int>(100000,10);
bytes += sizeof(*pt1);
bytes += pt1->size() * sizeof(pt1->at(0));
megabytes = bytes / 1000000;
if (i >= 1000 && i % 1000 == 0) {
printf("There are %d megabytes on the heap\n", megabytes);
}
}
}
在收到bad_alloc 错误之前这段代码的最终输出是:“堆上有 2000 兆字节”
在第二个程序中:
#include <stdio.h>
int main()
{
long long unsigned bytes = 0;
unsigned megabytes = 0;
for (long long unsigned i = 0; ; i++) {
int* pt1 = new int(10);
bytes += sizeof(*pt1);
megabytes = bytes / 1000000;
if (i >= 100000 && i % 100000 == 0) {
printf("There are %d megabytes on the heap\n", megabytes);
}
}
}
此代码在收到bad_alloc 错误之前的最终输出是:“堆上有 511 兆字节”
两个程序的最终输出大不相同。我对免费商店有什么误解吗?我认为这两个结果会差不多。
【问题讨论】:
-
不确定,是否相关,但Linux allocates memory lazily
-
@P.Dmitry 没关系:这里分配的数据由
10初始化。 -
@Ruslan 基本上是对的,但是编译器可以看到,这个值是未使用的,可以(?)删除这个初始化
-
@P.Dmitry 这发生在调试版本中(刚刚测试过)。我不希望在这种情况下发生这样的优化。
-
FWIW,我还得到第一种和第二种情况(4000 对 1071)之间的大约 4 倍差异。可能是由于管理 4 字节与 100000 字节分配块的开销。
标签: c++ memory-management out-of-memory