一文读懂 .bss段 的作用

6 篇文章 0 订阅
3 篇文章 0 订阅

网上诸多博主关于.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,操作系统做了这些事:

  1. 从bss段中找到 arr 变量;
  2. 到符号表中查找 arr 的类型大小,是4个字节;(符号表的可以用 map 实现,查找时间可忽略)
  3. bss段将记录的 arr 的大小改为:4000-4.
  • 29
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
.bss是指程序中未初始化的全局变量和静态变量所占用的内存空间。这部分内存在程序加载时会被清零,因此不需要额外的初始化操作。 stack是指函数调用和局部变量所使用的内存空间。每当一个函数被调用时,会在栈上分配一块内存空间来存储函数的参数、局部变量以及函数的返回地址等信息。当函数调用结束时,这块内存空间会被释放。 它们在内存中的位置和分配方式是不同的。.bss位于程序的数据,而stack位于栈。.bss的大小是在编译时确定的,而stack的大小是根据函数调用的深度和局部变量的需求动态分配的。 因此,.bss和stack是两个不同的内存区域,用于存储不同类型的数据。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [bss、data、text、heap(堆)与stack(栈)](https://blog.csdn.net/baicong9439/article/details/101089290)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [.text .data .bss .stack .heap 详解](https://blog.csdn.net/phenixyf/article/details/116718762)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值