【发布时间】:2016-05-10 20:53:12
【问题描述】:
我创建了 Virtual Ram 类来增加运行时的内存分配。
class VRam
{
unsigned char ***data;
...
public:
VRam(ulli length);
void *allocate(ulli size);
...
}
在我的程序中,小数组或变量分组分配在内存中,这使我可以在开始时分配一个巨大的数组,然后只使用其中的一部分,然后清除整个事情。 问题如下: 我最近更新了它,通过将它们分成更小的块来支持巨大的数组。我的程序在这次更新后运行良好,但即使我将内存限制设置为 2 GiB(这个空间量是在开始时分配的),系统监视器显示它只使用了 50 MiB,这很奇怪。经过一些测试:
ulli size = 2073741824;
int blocknum = size / VBLOCK_SIZE;
VRam *vr = new VRam(size);
int **arrs = new int*[blocknum];
for (int i = 0; i < blocknum; ++i) {
//cout<<i<<endl;
arrs[i] = (int*)vr->allocate(VBLOCK_SIZE);
arrs[i][0] = i; //<<<<<---------------
for (int j = 0; j < VBLOCK_SIZE / 4; ++j) {
//cout<<" "<<j<<endl;
arrs[i][j] = j+i; //<<<<-------------
}
}
我得到了以下结果: 如果我在分配的内存上构建所有内容,它将真正被分配,(第二个
【问题讨论】:
-
写零或使用 calloc。
-
如何检查分配的内存?请记住,您只是请求未初始化的页面。
-
landley.net/writing/memory-faq.txt Linux 内核使用延迟(按需)分配物理页面,将分配推迟到必要时,避免分配永远不会实际使用的物理页面。
标签: c++ memory memory-management allocation