我可以提供代码片段来交叉检查上面的
答案 0 :(得分:3)
如果不知道你正在处理的具体实施,就不可能肯定地说。在某些情况下,static int i=0;
将存储在初始化的数据段中,因为您已经提供了初始化程序。在其他情况下,无论如何BSS都将进行零初始化,因此无论如何链接器都会将其放在那里。如果您指定了不同的值(例如static int i=12345;
),那么您可以更好地确保将其置于初始化的数据段中。
extern
并不能确定链接器放置变量的位置。它几乎与上面一样:如果链接器知道(或安排)BSS被零初始化,那么外部没有指定初始化器的东西可能在BSS中。如果BSS未进行零初始化,则通常必须在初始化数据段中。
register
基本上等同于auto
- 它们都是在运行时分配的,通常是在寄存器中或堆栈中。
就验证而言,这更依赖于个人实施。您通常会通过查看链接器映射文件等内容来查找;如果你想自己解决这个问题,很可能会看到正在使用的符号格式,或者为你的系统开发可执行格式的内部。
答案 1 :(得分:1)
如前所述,这取决于。
就我而言(gcc& Linux),我决定去看看:
int main ( int argc, char **argv )
{
static int initialized_static_var = 0;
static int uninit_static_var;
register int reg_var;
extern int extern_var;
return 0;
}
然后objdump -x在可执行文件上(为简洁起见编辑):
0804a018 l O .bss 00000004 uninit_static_var.1704
0804a01c l O .bss 00000004 initialized_static_var.1703
寄存器变量和未使用的extern都不会出现在符号表中,如果您考虑它,这是有道理的。
答案 2 :(得分:0)
阅读本文:Where are static variables stored (in C/C++)?
然后制作自己的片段。