网上诸多博主关于.bss段的解释,看了一圈下来,神乎其神,完全脱离实际,只会用“古文”来喝退小白。然而,问题并未解决···因此,想综合自己的理解,用白话文将 .bss段 的作用给大家讲明白
1. 位置
在程序执行前,这块区域的大小就已经固定。值得注意的是,这块区域可以读写。
2. 作用
1)概念
BSS段通常是指用来存放程序中未初始化的或者初始化为0的全局变量和静态变量
也就是说,只要初始值为0的类型,都会先放在这里,等到再次赋值时才会被取出。
2)好处
节省磁盘空间。比如:
static int arr[1000];
int main()
{
while(1);
return 0;
}
在什么都不做的情况下,你猜程序运行时 数组arr 的内存占用是多少?
我们来算算:
int 是四个字节, 共有1000个元素
sizeof(arr) = 4*1000 = 4000B ≈ 4kB
你觉得这合适吗?
当然不可以,假如我们要打开“王者荣耀”,其中有【7种模式】,那么这【7种模式】都需要一下子加载出来吗?如果都加载出来,用户的等待时间又增加了几ms,你可能会想:“网速块,手机配置高,我又不在乎这点内存?”
好,那么再加上【英雄模型】,【符文】,【出装】等等都齐刷刷的一起加载出来,高配手机确实没问题,但是你别忘了,王者的很大一部分受众是小学生,他们用的是父母退役下来的手机。你觉得这好吗?小学生表示网卡就算了,游戏还卡,体验感大打折扣。(有试过王者在网速低的情况下的状态——每点击一个英雄,对应的模型才会加载出来,一百多个英雄,就少了很多模型上色渲染引发的损耗)
一百个英雄模型,就像arr数组一样,只是在 bss段 暂时记录着,并不会立刻申请这么大的内存,等到你点击时,手机才会加载模型,王者客户端才会从内存中的 bss段中划掉对应的那一个。
3. 实现
1)解释
对于数组 arr , bss段仅仅记录了变量名和数组大小,原来4kB大小的空间,现在只需记录两个变量即可,可能没有太多变化,但是,比如说游戏启动,这却是极大的提升,毕竟不是所有资源都需要立刻申请并赋值的,这就成为了提升的关键,开机启动不就是这个道理吗?
2)举例
现在赋值 arr[999] = 1,操作系统做了这些事:
- 从bss段中找到 arr 变量;
- 到符号表中查找 arr 的类型大小,是4个字节;(符号表的可以用 map 实现,查找时间可忽略)
- bss段将记录的 arr 的大小改为:4000-4.