我一直在测试我自己的一些代码,看看需要多少分配的内存来耗尽堆或空闲存储上的内存。但是,除非我的代码在测试中出错,否则我在堆上可以放置多少内存方面会得到完全不同的结果。
我正在测试两个不同的程序。第一个程序在堆上创建 vector 对象。第二个程序在堆上创建整数对象。
这是我的代码:
#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 MB”
在第二个程序中:
#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 MB”
两个程序的最终输出有很大不同。我对免费商店有什么误解吗?我认为这两个结果大致相同。
最佳答案
很可能 pointers returned by new
on your platform are 16-byte aligned .
如果 int
为 4
字节,这意味着对于每个 new int(10)
您将获得 4 个字节并生成 12 个字节无法使用。
仅此一点就可以解释从小分配中获取 500MB 可用空间与从大分配中获取 2000MB 可用空间之间的差异。
最重要的是,跟踪分配的 block (至少是它们的大小以及它们是否空闲或正在使用)会产生开销。这与系统的内存分配器非常相关,但也会产生每次分配的开销。请参阅 https://sourceware.org/glibc/wiki/MallocInternals 中的“什么是 block ”有关 glibc
分配器的说明。
关于c++ - 堆上的内存是如何耗尽的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58361081/