我有以下代码:
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
int main() {
int data = 0;
char *byte = (char *)malloc(sizeof(char)*1000000000);
byte[999999999] = 'a';
printf("%c",byte[999999999]);
scanf("%d",&data);
return 0;
}
在程序启动之前和scanf之前查看内存我希望内存增加1 GB。为什么不发生这种情况?
编辑:我添加了
byte[999999999] = 'a';
printf("%c",byte[999999999]);
该计划输出a
。
答案 0 :(得分:8)
默认情况下,Linux会在第一次访问时懒惰地分配物理内存。您对malloc
的调用将分配一大块虚拟内存,但还没有任何物理内存页面映射到它。第一次访问未映射的页面将导致错误,内核将通过分配和映射一个或多个物理内存页来处理。
要分配所有物理内存,您必须在每个页面上至少访问一个字节;或者您可以绕过malloc
并直接使用类似
mmap(0, 1000000000, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_POPULATE, -1, 0);
请注意使用MAP_POPULATE
来填充页表,即立即分配物理内存。根据该联机帮助页,这仅适用于相当新版本的Linux。
答案 1 :(得分:5)
大多数(全部?)Linux系统过度使用内存。这意味着malloc永远不会失败,即使你使用特定的提交策略你保留了大量的内存。如果您保留太多内存,例如超过虚拟内存,它可能会在某些情况下失败。
你没有获得真正的内存地址,只有一个指针被承诺指向足够的内存供你使用。如果您尝试使用它,系统会为您分配内存,因此您必须写入它以向系统发出您真正想要它的信号。
使用该系统是因为许多程序不需要他们保留的内存或在其他时间需要它。
在您的编辑后,您只能访问一个页面,因此您只能保留一页。您需要访问每个页面以获取所有内存。
答案 2 :(得分:0)
malloc
没有给你取1000000000
所有内容。在您开始访问它(读/写)之前,它只有1st
页面,您将获得其余部分。
Linux,malloc
请求会立即扩展虚拟地址空间,但在您访问之前不会分配物理内存页。