程序如何分配大量内存?

时间:2011-09-07 19:24:29

标签: memory memory-management assembly

我有3个关于内存分配的问题,我认为最好将其放入一个问题而不是3个。

  1. 按照我的理解分配内存时,它会在堆上分配,只有16mb。如何使用视频游戏或现代浏览器等程序使用超过1GB的程序?

  2. 由于显然可以使用这么多内存,为什么不能在开始时分配它?我发现我可以用高级汇编语言分配的最多大约是100MB。这远远超过16MB,远远低于我的3,所以这个限制来自哪里?

  3. 为什么首先分配内存,而不是分配变量并让编译器/系统处理它?<​​/ p>

1 个答案:

答案 0 :(得分:7)

  

根据我的理解分配内存时,它会在堆上分配,   这只是16mb。母鸡如何做电子游戏或现代游戏等节目   浏览器设法使用超过1GB?

堆可以增长。它不限于任何值,当然不是16MB。您可以轻松分配1GB的堆,只需进行程序测试即可。

  

因为显然可以使用这么多内存,为什么呢   难道不能在开始时分配吗?我找到了最多的东西   高级汇编语言分配大约100MB。这是一个   超过16MB,远远低于我3,所以这是在哪里   限制来自?

我不确定为什么你的操作系统没有填充更大的分配请求。也许是由于内存碎片?这将是您的设置特有的问题,您没有分享。我可以分配比没有问题的内存更多的内存。

如果mmap(使用malloc系统调用)遇到某种问题,您可以尝试使用brk系统调用。请注意,对于GNU libc,当分配足够大时,malloc实际上使用mmap代替brk(我认为超过128k)。

  

为什么首先分配内存,而不是分配内存   变量并让编译器/系统处理它?<​​/ p>

变量必须存在于某个地方的内存中。你说的是“为什么手动管理内存?为什么某些算法不能为我做这个?”。编译器和运行时组件处理分配/释放实际上是很常见的 - 它被称为garbage collection