.bss段的来历

本文探讨了.bss段的历史及其存在的原因。追溯至早期因磁盘空间限制而引入.bss段以存放未初始化变量的做法,并指出当前技术环境下此做法的必要性值得商榷。最终,在《深入理解计算机系统》一书中找到了关于.bss段起源的确切说明。

隐约记得之前好像哪本书讲了一下.bss段的来历。

大概意思是:

因为之前的磁盘空间很有限,定义了一个.bss段来存放未初始化的变量。

在生成目标文件的时候,.bss段可以不占用磁盘空间。但是在加载的时候,加载器

会把.bss段map到内存中。但是从目前的技术来看,这种做法实在没有必要,

还增加了加载器的逻辑,纯粹是延续(兼容?)之前的传统。


在网上百度了好久,也没找到是哪里讲的。所以在这里mark一下,看看以后能不能找到出处。


看来多读些书还是很有用的,说不上哪本书会把之前没弄明白的地方给你解释清楚了。

像这个例子,就会把.bss段当做一个很有趣的轶事来记。


重读了一下《深入理解计算机系统》,终于找到了出处。


“.bss 始于IBM 704汇编语言中的.(Block Storage Start)”,并沿用至今。

可以把.bss更好的看成(Better Save Space)。

优化程序的内存布局以减少未初始化数据(`.bss` )的存储开销,主要涉及对程序中全局变量、静态变量以及数据结构的合理设计和组织。`.bss` 用于存储未显式初始化的全局和静态变量,在程序编译时不会在可执行文件中占用实际磁盘空间,但在运行时会占用内存空间。因此,优化 `.bss` 的大小可以有效减少程序的内存占用,提高程序的性能和可伸缩性。 ### 减少 `.bss` 的存储开销 1. **避免不必要的全局变量和静态变量** - 全局变量和静态变量会直接进入 `.bss` (如果未初始化)或 `.data` (如果已初始化)。通过减少全局变量和静态变量的使用,可以显著减少 `.bss` 的大小。 - 将变量的作用域限制在函数内部,使用局部变量替代全局变量。局部变量通常存储在栈上,生命周期短,不会增加 `.bss` 的大小。 2. **使用 `static` 限定符限制变量作用域** - 对于仅在当前文件中使用的全局变量,应使用 `static` 关键字限制其作用域。这不仅可以减少符号冲突的风险,还可以帮助编译器进行优化,减少不必要的内存占用。 3. **合并重复的全局变量** - 如果多个全局变量具有相同的用途或语义,可以考虑将其合并为一个结构体或数组,从而减少变量数量并优化内存布局。 - 使用结构体可以提高内存的紧凑性,尤其是在涉及对齐问题时。 4. **避免大型未初始化数组** - 大型未初始化的数组会占据大量的 `.bss` 空间。可以考虑使用动态内存分配(如 `malloc` 或 `new`)来替代静态数组,将内存分配推迟到运行时,从而减少 `.bss` 的大小。 - 如果必须使用静态数组,确保其大小是合理且必要的。 5. **使用 `zero-initialized` 替代未初始化变量** - 如果变量在程序启动时需要初始化为零,可以显式地进行初始化,这样变量仍然会进入 `.bss` ,但可以避免未初始化变量带来的潜在问题。 - 例如: ```c int global_var = 0; // 进入 .bss ``` 6. **使用编译器优化选项** - 现代编译器(如 GCC 和 Clang)提供了多种优化选项,可以帮助减少 `.bss` 的大小。例如,使用 `-fdata-sections` 和 `-Wl,--gc-sections` 可以让链接器删除未使用的数据。 - 示例编译命令: ```bash gcc -O2 -fdata-sections -Wl,--gc-sections -o my_program my_program.c ``` 7. **利用自定义内存分配器** - 对于需要频繁分配和释放内存的程序,可以使用自定义的内存分配器来减少内存碎片并优化内存布局。例如,使用 STL 中的 `allocator` 机制可以对内存分配进行更精细的控制[^2]。 8. **优化结构体和类的成员布局** - 在 C/C++ 中,结构体和类的成员顺序会影响内存对齐和填充(padding)。通过将成员按大小从大到小排序,可以减少填充字节数,从而节省内存空间。 - 例如: ```c struct Example { double d; // 8 bytes int i; // 4 bytes char c; // 1 byte }; ``` 9. **使用位域(bit-fields)** - 对于需要存储多个布尔值或小型整数的场景,可以使用位域来减少内存占用。位域允许将多个字打包到一个整数中。 - 例如: ```c struct Flags { unsigned int flag1 : 1; unsigned int flag2 : 1; unsigned int count : 4; }; ``` 10. **使用 `packed` 属性减少结构体大小** - GCC 提供了 `__attribute__((packed))` 属性,可以强制编译器不对结构体成员进行对齐填充,从而减少结构体的总大小。 - 例如: ```c struct __attribute__((packed)) PackedStruct { char c; int i; }; ``` 通过上述方法,可以有效地优化程序的内存布局,减少 `.bss` 的大小,从而降低程序的内存占用并提高性能。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值