【发布时间】:2021-05-29 02:51:37
【问题描述】:
静态内存布局的 BSS 部分 [应该是] 用于“未初始化的全局变量”或“全局变量设置为 0”。
我正在运行一些测试,突然注意到局部静态变量也在增加 BSS 段的大小。
示例:-
任何静态变量之前
int main (int argc, char argv[])
{
return 0;
}
data/repos/e-c
❯ size a.out
text data bss dec hex filename
1418 544 8 1970 7b2 a.out
静态变量之后
int main (int argc, char *argv[])
{
static int a, b, c;
return 0;
}
data/repos/e-c
❯ !s
size a.out
text data bss dec hex filename
1418 544 16 1978 7ba a.out
那些变量肯定不是全局变量,那为什么 BSS 段在增加呢?或者“未初始化的全局变量的段”的想法不完全正确?
目前我在 Linux 上,使用 GCC 编译器(版本 9.3.0)。
【问题讨论】:
-
嗯,哪里说 BSS 只适用于全局?维基百科说“BSS 段包含所有初始化为零或在源代码中没有显式初始化的全局变量和静态变量。”。
-
static变量与全局变量具有相同的存储类。 -
@mediocrevegetable1,是和否。
static对于文件范围声明的含义与对于块范围声明的含义不同。声明的标识符具有内部链接是文件范围的效果。声明的对象具有静态存储持续时间(在文件范围内声明的所有对象都具有,无论是静态的还是外部的)是块范围内的效果。 -
global 在这里是一个误导性的术语。你不像storage duration那样关心访问级别。