提问人:A coin has two sides 提问时间:6/1/2023 最后编辑:dbushA coin has two sides 更新时间:6/1/2023 访问量:87
C编程中未初始化的全局静态变量的存储
Storage of uninitialized global static variable in C programming
问:
据我所知,未初始化的全局静态变量占用 bss 中的内存空间。但是,当我在 c 程序中声明一个全局静态变量时,bss 的大小并没有增加。
我试过了:
#include<stdio.h>
static int i;
int main ()
{
return 0;
}
答:
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 字节
评论
printf("%d\n", i);
<stdio.h>
printf()
puts("0");
i