从编译链接的ELF结构看static关键字

本文深入探讨了C++中的static关键字在修饰全局变量、局部变量、普通函数以及类的成员方法和成员变量时的影响。static会使全局变量变成局部作用域,存储在.data或.bss段,避免重定义错误;对于局部变量,将其存储在.data段;静态函数限制为仅在当前文件可见;静态成员方法不依赖对象,可通过类名调用;静态成员变量属于类而非对象,存储在.data或.bss,直接通过类访问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文主要讨论static在C++中的应用

(1)static修饰全局变量和局部变量

全局变量属于数据,不是放在.data段,就是在.bss段;如果是一个常量字符,那么存储于.rodata段;

局部变量属于指令,存储于.text段,运行时系统为其分配栈上空间,函数的局部变量此时表示栈上的一段内存;那么加了关键字之后有何变化呢?请看如下代码:

int gdata1 = 10;//全局变量


int main()
{
   int gdata2 = 20;//局部变量
   printf("gdata2 = %d\n",gdata2);
}

通过objdump -t *.o查看到他们在段上的布局如下图:

从上图可以看到gdata1存放在.data段,gdata2存放在.text段;加上关键字static之后,打印段表信息如下图所示:

从两个图可以分析出gdata1从global符号变为local符号并且仍然存储在.data段,gdata2由存放在.text段变为存放在.data,此时它是一个local的数据,由于local符号外部文件不可引用,所以不参与符号解析,因此同一工程里多个源文件定义同名的静态全局变量,不会产生重定义错误。

(2)static修饰普通函数

static函数,经过编译链接产生一个local符号,不参与符号解析,因此其他文件不能引用此函数;

(3)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值