C/C++程序启动后内存分布

本文深入探讨了程序中内存的分配区域,包括代码区、数据区、堆、动态库文件映射及栈,并详细解释了函数压栈的过程以及不同线程栈的管理方式。同时,阐述了程序内存的虚拟地址空间概念,以及动态库如何在内存中呈现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 从低地址开始,依次是代码区,数据区(包含静态数据区、常量数据区)、堆(自下向上生长)、动态库的文件映射、栈


2 函数压栈:从高地址到低地址(也是从栈底到栈顶)来看,先是函数参数从右向左,然后是返回地址(调用函数前的下一行代码),被调用函数地址,EBP/ESP,局部变量(按从上到下的声明顺序)


3 不同线程的栈有一定的间距,基本等同于线程栈的限制大小,线程切换前会保存当前线程的栈顶,这样当再次切换回来时,可以从栈顶向下分配


4 程序的有些内存之存在虚拟地址空间,如果实际没有使用,在某些编译器和操作系统上,不会分配实际的物理内存


5 动态库方面,有些正如文件映射的性质,只是指向内核中的共享内存,有些则是自己的私有内存,如果一定要算内存大小,应该是私有内存+共享内存(使用进程数),具体使用可以看/proc/<process id>/smaps

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值