静态内存布局的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)。
发布于 2021-02-27 02:38:20
静态内存布局的BSS部分是
应该是
表示“未初始化的全局变量”或“设置为0的全局变量”。
不清楚你是从哪里得到这种印象的,但它充其量也是误导性的。大多数人在C上下文中使用术语“全局变量”表示对象标识符
外部链接
,这对于具有
静态存储时长
..。只需几个条件,就可以在程序中的任何地方使用这样的标识符来引用相同的对象,因此称为“全局”。一些条件的存在和性质使得使用术语“全局”来处理这些问题有点令人担忧,但我将把这个问题留给一个不同的答案。
BSS的关键点不是连接,而是存储时间。静态存储持续时间意味着,至少在原则上,对象开始存在
*
在程序开始时或之前,并(至少)一直持续到程序终止。与在块范围内声明的变量不同
:这些有
自动存储时间
这意味着它们在声明时就存在了,并且只存在到它们最内部的包含块的执行终止为止。
具有静态存储持续时间的对象需要在程序映像中表示,而不考虑它们的链接,因为它们与程序本身具有相同的生命周期。C指定在此类对象未显式初始化的情况下,它们的初始值就好像它们被初始化为0(对于数值类型)或
(指针类型)或复合类型的成员级。BSS是一种节省空间和时间的快捷方式,用于表示此类对象和显式初始化为0的对象的存储。
满足初始化条件的所谓“全局”变量可以并且通常被归因于BSS,但也是如此
文件范围内的变量
内部链接
)的效果
在该范围内的声明上;它们自动具有静态存储持续时间,但只能从一个源文件访问,并且
具有静态存储持续时间的块范围变量,通过使用
关键字,即使这些关键字具有
没有
链接。
*
在C++中,其中一些对象会在以后进行动态初始化,但这些对象的内存仍然为程序的整个运行保留,并且它们在程序启动时需要进行零初始化。它们具有预留的内存和明确定义的值,这就构成了这个答案的存在。
https://stackoverflow.com/questions/66390645
复制相似问题