Jas*_*ill 1 memory assembly memory-management
我有3个关于内存分配的问题,我认为最好把它放在一个问题而不是3个问题上.
根据我的理解分配内存,它在堆上分配,只有16mb.如何使用视频游戏或现代浏览器等程序使用超过1GB的程序?
由于显然可以使用这么多内存,为什么不能在开始时分配它?我发现我可以用高级汇编语言分配的最多大约是100MB.这远远超过16MB,远远低于我的3,所以这个限制来自何处?
为什么首先分配内存,而不是分配变量并让编译器/系统处理它?
根据我的理解分配内存,它在堆上分配,只有16mb.如何使用视频游戏或现代浏览器等程序使用超过1GB的程序?
堆可以增长.它不限于任何值,当然不是16MB.您可以轻松分配1GB的堆,只需进行程序测试,您就会看到.
由于显然可以使用这么多内存,为什么不能在开始时分配它?我发现我可以用高级汇编语言分配的最多大约是100MB.这远远超过16MB,远远低于我的3,所以这个限制来自何处?
我不确定为什么你的操作系统没有填充更大的分配请求.也许是由于内存碎片?这将是您的设置特有的问题,您没有分享.我可以分配比没有问题的内存更多的内存.
mmap
如果malloc
(使用brk
系统调用)遇到某种问题,您可以尝试使用系统调用.请注意,对于GNU libc,malloc
实际上是使用mmap
而不是brk
在分配足够大时(我认为超过128k).
为什么首先分配内存,而不是分配变量并让编译器/系统处理它?
变量必须存在于某个地方的内存中.你说的是"为什么手动管理内存?为什么某些算法不能为我做这个?".实际上,编译器和运行时组件处理分配/释放是很常见的 - 它被称为垃圾收集.