专业汉语词典知识平台,分享汉字词语知识、历史文学知识解答!

励北网
励北网

静态变量的特点,深入理解静态变量

来源:小易整编  作者:小易  发布时间:2023-03-17 07:53
摘要:静态变量的特点,深入理解静态变量全局静态变量数据存储:已初始化的存储在数据区中的已初始化变量区。未初始化的存储在数据区中的未初始化变量区。作用域:文件作用域。本质:是受编译器按语法约束的全局变量。作用:私有化某些变量和方法,以文件为单位对源...

静态变量的特点,深入理解静态变量

 
F11跟进_cinit:
 

静态变量的特点,深入理解静态变量

 
此时到了第二个_intitterm按F10(不要按F11跟进去)自动跳转到在GetInt函数头部下的断点的位置。
 

静态变量的特点,深入理解静态变量

 
第一个为_initterm官方的全局变量初始化,第二个_initterm才为用户的全局变量初始化。
 
全局变量结束
我们继续探测全局变量的值被释放的结束的地方。
 
在main函数return处下断点,单步步过到进程结束的位置,查看全局静态变量值的变化。
 
一路F10跟到MainCRTStartup中的exit(mainret);处,全局静态变量内存的值仍未发生变动,此时单步执行exit时,程序结束。
 

静态变量的特点,深入理解静态变量

 
所以,我们可以判定,全局变量的生命周期是从所处模块装载到所处模块卸载。

编译器控制跨文件访问:限制导出

全局静态变量主要用途就是限制导出,实现其函数和变量的私有化,编译器通过限制导出机制来控制其跨文件访问的。
 
导入:使用其他模块中的符号。
 
导出:提供某个符号给其他的模块用。
 
例如:静态函数
 
static void foo(),只能在本文件中使用,不可以跨文件调用,这样则有利于开发过程中的私有化,从而摘轻各自开发者的责任。
 
早期编译器的私有概念是通过static来实现的,后来才完善这个概念,并逐步发展为其他的面向对象语言,比如C++。
 
在没有面向对象概念的时候,使用static来实现私有化。
 
 
使用限制导出思想的demo
main.c:

static char* msg = "Hello";char* GetMsg(){    return msg;}

Test.c:

printf("%s\r\n",GetMsg());

 
控制跨文件访问
编译器编译阶段将全局静态变量进行处理,在链接阶段时候,其他文件便不能够访问本文件中的全局静态变量了,会产生报错。
 

静态变量的特点,深入理解静态变量

 
但是仅仅是编译器层面做的处理,全局静态变量的值依旧存在内存中,可以用如下的方法进行访问。
 
main.cpp:

#include <stdio.h>#include <stdlib.h> static int g_nTest = 0x996;int g_nTest2 = 0x123;void printFun(); int main(){    printFun();    //printf("%p\r\n",&g_nTest2);    system("pause");    return 0;}

Test.cpp:

#include <stdio.h>extern int g_nTest2; void printFun(){    printf("%x\r\n",(&g_nTest2)[-1]);}

静态变量的特点,深入理解静态变量

局部静态变量
  • 数据存储:

    • 已初始化的存储在数据区中的已初始化变量区。

    • 未初始化的存储在数据区中的未初始化变量区。

  • 作用域:与所在函数作用域相同。

  • 生命周期:与全局静态变量相同。

  • 作用:局部静态变量可以在过程或函数重复运行的时候保留上次运行的值。

名称粉碎
名称粉碎(Name-mangling)又名命名粉碎或命名重组,是指在目标文件符号表和连接过程中使用的名字通常与编译目标文件的源程序中的名字不一样,编译器将目标源文件中的名字进行了调整。
 
编译器对局部静态变量使用了名称粉碎机制。
 
首先将其声明成全局变量,然后将其作用域插入到全局变量名称中去,类似于snTest_fooD通过这种方式将全局变量限制为在某函数里面才可以访问。
 
不同编译器厂商对局部静态变量的名称粉碎机制存在差异,有些会将参数和返回值也加入到重组后的名称中,名称粉碎和编译器厂商的习惯相关,不属于标准,所以,不同的厂商不同的版本,甚至不同的版本规则都不一样。
 
编译器的名称粉碎机制测试方法
修改各项函数属性,编译后,打开对应的obj文件,搜索局部静态变量名,查看不同属性参数的修改对于名称粉碎后的局部静态变量名的影响。

本文地址:百科问答频道 https://www.neebe.cn/wenda/931319_2.html,易企推百科一个免费的知识分享平台,本站部分文章来网络分享,本着互联网分享的精神,如有涉及到您的权益,请联系我们删除,谢谢!


百科问答
小编:小易整编
相关文章相关阅读
  • win10环境变量怎么设置?在Windows 10中创建环境变量的3种方法(详细)

    win10环境变量怎么设置?在Windows 10中创建环境变量的3种方法(详细)

    设置环境变量是编程过程中经常需要做的事情,这里我们来讨论如何在Windows10中创建环境变量。Windows中的环境变量是包含有关系统环境和当前登录用户信息的值。除了Windows之外,环境变量也存在于微软之前的操作系统中,例如MS-D...

  • classpath环境变量作用,Java环境变量classpath的作用

    classpath环境变量作用,Java环境变量classpath的作用

    classpath环境变量作用,Java环境变量classpath的作用环境变量环境变量(environmentvariables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。环境变量是在操...

  • linux怎么设置环境变量,linux设置环境变量的6种方法

    linux怎么设置环境变量,linux设置环境变量的6种方法

    linux怎么设置环境变量,linux设置环境变量的6种方法Linux读取环境变量读取环境变量的方法:export命令显示当前系统定义的所有环境变量echo$PATH命令输出当前的PATH环境变量的值这两个命令执行的效果如下其中PATH变量...

  • 如何定义全局变量,C语言定义全局变量

    如何定义全局变量,C语言定义全局变量

    如何定义全局变量,C语言定义全局变量全局变量C语言提供了全局变量的定义,全局变量也称为:外部变量。全局变量就是定义在函数外的变量。它不属于大括号{}包含的某个代码块,所以,它的作用域不是在某个代码块内,是在整个源程序中。所以,可以在源程序中...

  • 静态变量的特点,深入理解静态变量

    静态变量的特点,深入理解静态变量

    静态变量的特点,深入理解静态变量全局静态变量数据存储:已初始化的存储在数据区中的已初始化变量区。未初始化的存储在数据区中的未初始化变量区。作用域:文件作用域。本质:是受编译器按语法约束的全局变量。作用:私有化某些变量和方法,以文件为单位对源...

  • 静态ip怎么设置,如何设置静态ip地址

    静态ip怎么设置,如何设置静态ip地址

    静态ip怎么设置,如何设置静态ip地址静态IP地址是网络上计算机或设备的唯一地址。与由网络分配并随时间变化的动态IP地址不同,静态IP地址是固定的。静态IP地址对于需要远程访问其计算机或设备的用户非常有用,因为它可以确保地址不会更改并且连接...

  • 变量名是什么意思,变量名的命名原则

    变量名是什么意思,变量名的命名原则

    变量名是什么意思,变量名的命名原则现在我们来看一下变量的三大组成部分。首先的就是变量名,它指向的就是等号右侧的值的内存地址,是用来访问右侧的值的。然后就是赋值符号‘=’等号,它是用来将变量值的内存地址绑定给变量名的。最后就是变量值,它是表示...

  • 自学Java2(保姆级教学)——常量与变量

    自学Java2(保姆级教学)——常量与变量

    自学Java2(保姆级教学)——常量与变量顾名思义,常量就是在程序运行过程中,其值不会发生改变的量;变量则是在程序运行过程中其值可以发生改变的量。常量比较好理解,这里着重讲变量,而变量的主要作用就是取值和修改值。首先我将书上对变量的解释写一...

  • 周排行
  • 月排行
  • 年排行

精彩推荐