首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么局部静态变量是BSS段的一部分?

为什么局部静态变量是BSS段的一部分?
EN

Stack Overflow用户
提问于 2021-02-27 01:55:30
回答 1查看 245关注 0票数 1

静态内存布局的BSS部分是

应该是

表示“未初始化的全局变量”或“设置为0的全局变量”。

我正在运行一些测试,突然注意到局部静态变量也在增加BSS段的大小。

示例:-

在任何静态变量之前

代码语言:javascript
复制
int main (int argc, char argv[])
{
    return 0;
}
代码语言:javascript
复制
data/repos/e-c 
❯ size a.out 
   text   data     bss     dec     hex  filename
   1418    544       8    1970     7b2  a.out

在静态变量之后

代码语言:javascript
复制
int main (int argc, char *argv[])
{
    static int a, b, c;
    return 0;
}
代码语言:javascript
复制
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)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-27 02:38:20

静态内存布局的BSS部分是

应该是

表示“未初始化的全局变量”或“设置为0的全局变量”。

不清楚你是从哪里得到这种印象的,但它充其量也是误导性的。大多数人在C上下文中使用术语“全局变量”表示对象标识符

外部链接

,这对于具有

静态存储时长

..。只需几个条件,就可以在程序中的任何地方使用这样的标识符来引用相同的对象,因此称为“全局”。一些条件的存在和性质使得使用术语“全局”来处理这些问题有点令人担忧,但我将把这个问题留给一个不同的答案。

BSS的关键点不是连接,而是存储时间。静态存储持续时间意味着,至少在原则上,对象开始存在

*

在程序开始时或之前,并(至少)一直持续到程序终止。与在块范围内声明的变量不同

:这些有

自动存储时间

这意味着它们在声明时就存在了,并且只存在到它们最内部的包含块的执行终止为止。

具有静态存储持续时间的对象需要在程序映像中表示,而不考虑它们的链接,因为它们与程序本身具有相同的生命周期。C指定在此类对象未显式初始化的情况下,它们的初始值就好像它们被初始化为0(对于数值类型)或

(指针类型)或复合类型的成员级。BSS是一种节省空间和时间的快捷方式,用于表示此类对象和显式初始化为0的对象的存储。

满足初始化条件的所谓“全局”变量可以并且通常被归因于BSS,但也是如此

文件范围内的变量

内部链接

)的效果

在该范围内的声明上;它们自动具有静态存储持续时间,但只能从一个源文件访问,并且

具有静态存储持续时间的块范围变量,通过使用

关键字,即使这些关键字具有

没有

链接。

*

在C++中,其中一些对象会在以后进行动态初始化,但这些对象的内存仍然为程序的整个运行保留,并且它们在程序启动时需要进行零初始化。它们具有预留的内存和明确定义的值,这就构成了这个答案的存在。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66390645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档