2011-09-07 77 views
1

我有3点关于内存分配的问题,我认为更好的将内存分配按照我的理解,它是在堆上,这仅仅是16MB分配给放进一个问题比3程序如何分配大量内存?

  1. 。诸如视频游戏或现代浏览器等程序如何管理超过1GB?

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

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

回答

7

当我了解内存分配,它是在堆中分配, 这仅仅是16MB。如何使用视频游戏或现代浏览器等程序管理超过1GB?

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

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

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

如果malloc(使用brk系统调用)出现某种问题,则可以尝试使用mmap系统调用。请注意,对于GNU libc,malloc实际使用mmap而不是brk当分配足够大(我认为超过128k)。

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

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

+1

但它不只是垃圾收集。自动分配内存的方法有限 - 称为局部变量。 – svick

+0

对于很多语言来说,局部变量要么被优化掉,要么在寄存器中短暂居住,要么住在堆栈上。请记住,这是语言和/或语言实现的所有部分 - 仅仅因为变量是本地的并不意味着语言不会将该值放入堆中。 –

+0

@Thomas谢谢你的回答。我想我的意思是为什么说明只是声明一个变量,包括数据的本地,全局或静态,例如用于视频游戏的纹理,而不是稍后分配和使用它? –