动态内存管理原理?
动态内存管理原理是什么?
动态分配、释放由动态存储管理系统完成,这是程序运行系统的子系统,管理着称作堆(英文heap)的存储区。
int n;
...
scanf("%d", &n);
double scores[n]; /* 不行!*/
... /* 读入数据,然后处理 */
不能用变量说明scores大小(必须静态确定)。---------------这个从编译的角度理解下,就可以明白,数组是连续的空间,大小都不确定,怎么编译!
但是对动态内存管理不是很明白,前面第二句话,有点迷惑了,我们写的程序里还有子系统?在我现在的理解来看,程序的本质就是指令呀,机器码。 但总感觉从机器码的角度,理解不了,堆栈这些概念(虽然一直在用,讲内存模型就经常说这个,但就是不明白,堆栈的原理!)!这个子系统到底是什么意思,C相对Java不是很底层了么,那么汇编有堆栈的概念么? 能否深层次的讲解下
[解决办法]
楼主首先得明白堆和栈是不同的概念,二者不可混为一谈,国内很多教科书都堆栈堆栈地混在一起,这个很不好。
1. 堆对应的英文是heap,栈对应的英文是stack。
2. 动态内存分配,比如C++的new或者C中的malloc所分配的内存都处在heap上;局部变量或者非全局数组所占用的内存通常是在stack上
3. 堆的地址是向上增加的,栈的地址是向下发展的。比如,在对上有一个对象o1,然后在对上在分配一个对象o2,那么o2的地址比o1的地址大。如果在栈上,情况刚好相反。
所谓子系统之说,只是一种说法而已,不必过于纠结了。
可以参考:
一个进程在内存中的布局
[解决办法]
堆和栈完全不是一个概念,栈是存储局部变量和程序调用时的返回地址的,先进先出。
堆是用来动态的分配和释放内存的,这个没什么不好理解的,你申请的时候os就给你分配一块内存,free的时候,os就回收它
汇编是有堆栈的概念的,cpu也有个sp堆栈寄存器,用来保存栈顶地址
[解决办法]