一个可执行程序(目标文件)的结构(common段,bss段,data段,text段,堆,栈)

common段:common段存放弱引用的符号,即未初始化的全局变量,在链接时再放入bss段(有些编译器也会直接放到bss段,故有些文章也直接说未初始化的全局变量在bss段中,这并不冲突)

bss段:bss即Block Started by Symbol的简称,存放程序中未初始化全局变量和初始化为0的全局变量的一块内存区域。BSS段属于静态内存分配。

(注:gcc编译选项-fno-common会强制把为未初始化的全局变量放入bss段,变为强符号。由于强符号只能存在一处定义,如果有多处强符号定义,则在链接阶段会报错。此编译选项可以提前防止强符号覆盖弱符号引起的运行时的未知错误,故十分建议添加)

data段:通常是指用来存放程序中初始化的不为0的全局变量的一块内存区域。数据段属于静态内存分配。

(注:函数的局部变量加了static后也会放入data段或bss段,由初始化的情况决定具体是在二者的哪一个,均为静态内存分配。这也是为什么函数局部变量加了static后就只会初始化一次(不会因为函数的再调用而再次初始化)的原因)

text段:通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读。

堆(heap) :程序运行中动态分配的内存段,大小不固定,可动态扩张或缩减。调用malloc和new分配的内存。

(注:堆内存适用于需要程序员手动管理的内存,以及较大的内存分配。另:如果频繁的分配较小的堆内存,则易加剧内存碎片化)

栈(stack) :栈又称堆栈, 存放程序的局部变量以及函数入参。函数调用时,也被压入栈。

(注:由于栈空间通常比较小,一般Linux程序只有几M,故局部变量,函数入参应该避免出现超大栈内存使用,比如超大结构体,超大数组等。避免出现stack overflow)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值