C编程中未初始化的全局静态变量的存储

Storage of uninitialized global static variable in C programming

提问人:A coin has two sides 提问时间:6/1/2023 最后编辑:dbushA coin has two sides 更新时间:6/1/2023 访问量:87

问:

据我所知,未初始化的全局静态变量占用 bss 中的内存空间。但是,当我在 c 程序中声明一个全局静态变量时,bss 的大小并没有增加。

我试过了:

#include<stdio.h>

static int i;

int main ()
{
    return 0;
}
C 变量 内存 静态 全局

评论

2赞 arrowd 6/1/2023
你如何衡量它?
7赞 dimich 6/1/2023
您使用什么编译器和标志?不使用变量,可能会因优化而被删除。生成地图文件并检查它。
4赞 Jonathan Leffler 6/1/2023
添加以证明包含和使用变量的合理性。即便如此,优化器也可能通过将调用替换为 来击败我们。您可以添加一个循环来打印多次。printf("%d\n", i);<stdio.h>printf()puts("0");i
0赞 A coin has two sides 6/1/2023
我在命令提示符下通过大小示例(程序名称).exe 命令来测量它。
1赞 A coin has two sides 6/1/2023
添加 printf(“%d\n”, i);数据大小增加,但 BSS 大小相同。

答:

0赞 yvs2014 6/1/2023 #1

假设它是这样的:

在上面的例子中,如果出现 absense “static int i”,则 .bss 部分的 int 大小默认对齐,假设 64b arch 为 8。即有 bss_size=8。
当你添加 “static int i” 时,你会得到相同的 bss_size=8,在本例中是这个静态 int。 如果添加 “static int i[2]”,将显示 bss_size=16
With “static int i[3]”: bss_size=24,依此类推。

例如,在 x86_64 Linux 上:

$ cat a0.c
//static int i;
int main () { return 0; }

$ cat a1.c
static int i;
int main () { return 0; }

$ cat a3.c                                                                                                 
static int i[3];
int main () { return 0; }

$ gcc -o a0 a0.c; gcc -o a1 a1.c; gcc -o a3 a3.c
$ size a0 a1 a3
   text    data     bss     dec     hex filename
   1228     544       8    1780     6f4 a0
   1228     544       8    1780     6f4 a1
   1228     544      24    1796     704 a3

如果我没记错的话,默认填充在 ld 的评论中:

  .bss            :
  {
   *(.dynbss)
   *(.bss .bss.* .gnu.linkonce.b.*)
   *(COMMON)
   /* Align here to ensure that the .bss section occupies space up to
      _end.  Align after .bss to ensure correct alignment even if the
      .bss section disappears because there are no input sections.
      FIXME: Why do we need it? When there is no .bss section, we do not
      pad the .data section.  */
   . = ALIGN(. != 0 ? 64 / 8 : 1);
  }

评论

0赞 A coin has two sides 6/1/2023
添加 static int i 作为全局变量后,bss 的大小没有变化。bss 的大小是相同的。
0赞 yvs2014 6/1/2023
> 添加 static int i 作为全局变量后,bss 的大小没有变化。事情就是这样。尝试将 size 增加一点而不是 minsize,例如 'static int i[10];',然后签出bss_size(例如使用 'size' 程序,如上面的回复)。
0赞 A coin has two sides 6/5/2023
int main() {返回 0;} static int i;int main() { 返回 0;} static int i[3];int main(){ return 0;} static int i[10];int main() {return 0;} 大小 work6.exe 文本数据 bss 十二月 9708 2200 2432 14340 大小 work7.exe 9708 2200 2432 14340 大小 work8.exe 9708 2200 2432 14340 大小 work9.exe 9708 2200 2496 14404
0赞 yvs2014 6/6/2023
@Acoinhastwosides从显示的输出中,如果我正确发现它,BSS 从 2432 增加到 2496 的 64 字节