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

gupuwyp2  于 2023-06-05  发布在  其他
关注(0)|答案(1)|浏览(201)

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

#include<stdio.h>

static int i;

int main ()
{
    return 0;
}
nqwrtyyt

nqwrtyyt1#

假设它是这样的:
在上面的例子中缺少“static int i”的情况下,.bss节的默认对齐大小为int,假设64b arch为8。bss_size=8。
当你添加“static int i”时,你得到了相同的bss_size=8,在这个例子中是这个static int。
如果添加“static int i[2]",则会显示bss_size=16
使用“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);
  }

相关问题