nm命令实战2: C++的static变量到底存储在哪里

2023-03-27 19:27:54

上一篇

先说结论

  • 已初始化存储在.data节,未初始化存储在.bss节,不管是否初始化,static关键字修饰的变量不允许外部引用。

总结

  • 普通全局变量可被外部引用,
  • static全局变量不可被外部引用
  • 局部变量不可被外部引用

验证

1. main.c如下

static int global_var1 = 1;
static int global_var2;
int fun(){
	static int inner_var1 = 3;
	int inner_var2 = 4;
	return 0;
}

cc -o main.o -c main.c编译

2. nm命令查看.symtab

nm -f sysv -n main.o

三. 输出分析

1. static存储位置

在这里插入图片描述

  • 新概念:Class里,小写字母全部为本地作用域
  • 可用看出func可以被外部引用,存放在.text中
  • global_var 和 global_var2因为均有static修饰,所以统统是小写
    在这里插入图片描述
  • 同时global_var1是初始化的,所以放在了.data节,var2没有初始化,所以放在了.bss节

2. 改名的变量

3. 消失的变量

  • 我们定义的 inner_var2怎么没了?
  • 符号表.symtab存放全局符号和static符号,其他局部变量不存储。

4. 如何引用局部变量?

C++里这是不可能的。
实际上,局部变量没有名字,观察如下汇编语句我们可以发现,只是一些内存分配而已,

  • 这是显然的,既然不能被外部引用,给它定义一个名字放入符号表就没有意义。
    在这里插入图片描述

5. 全局和函数内可以有同名的static变量吗?

在这里插入图片描述

  • 验证发现,完全可以,会给某一个static分配一个新的名字,类似于对重载函数的处理。
  • 作者:猪二哥
  • 原文链接:https://blog.csdn.net/weixin_42254068/article/details/118799617
    更新时间:2023-03-27 19:27:54