内存空间为什么要分栈和堆?
- 栈是机器系统提供的数据结构,计算机会在底层对栈提供支持(硬件支持栈顶指针):分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。栈空间直接分配(地址指针偏移,压栈弹栈),堆空间需要反复申请
- 堆是C/C++函数库提供的,调用系统功能去增加程序数据段的内存空间。显然堆效率比栈要低得多。
我们用到的每一个地址都是虚拟地址,没有一个是物理地址,映射到物理地址而已,映射关系放在进程内核中
linux下把每个物理内存切成叶,大小为4k
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* print_stack(){
//栈空间函数执行结束,就会被释放,操作系统管理
//如果这里用栈空间数据
//return出来是错误写法
char c[]="I am stack";
return c;
}
char* print_malloc(){
char *p=(char*)malloc(12);
strcpy(p,"I am malloc");
return p ;
}
int main()
{
char *p;
p=print_stack();
//p打印不出,因为print_stack()延迟退栈
//外面再用原来数据,数据已经灰飞烟灭
puts(p);
//堆的空间只有free释放才还给操作系统,是自己管理的
//申请了没有free就一直存在,堆空间整个生命周期都有效
p=print_malloc();
puts(p);
system("pause");
}