内存空间为什么要分栈和堆?

内存空间为什么要分栈和堆?

  • 栈是机器系统提供的数据结构,计算机会在底层对栈提供支持(硬件支持栈顶指针):分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。栈空间直接分配(地址指针偏移,压栈弹栈),堆空间需要反复申请
  • 堆是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");
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值