问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

编程里,自动变量和寄存器变量是怎么回事?

发布网友 发布时间:2022-05-06 19:56

我来回答

1个回答

热心网友 时间:2023-09-14 09:27

什么是自动变量呢?自动变量就是指在函数内部定义使用的变量。他只是允许在定义他的函数内部使用它。在函数外的其他任何地方都不能使用的变量。自动变量是局部变量,即它的区域性是在定义他的函数内部有效。当然这说明自动变量也没有链接性,因为它也不允许其他的文件访问他。由于自动变量在定义他的函数的外面的任何地方都是不可见的,所以允许我们在这个函数外的其他地方或者是其他的函数内部定义同名的变量,他们之间不会发生冲突的。因为他们都有自己的区域性,而且它没有链接性(即:不允许其他的文件访问他的)。来看看自动量的持续性。计算机在执行这个函数的时候,创建并为它分配内存,当函数执行完毕返回后,自动变量就会被销毁。这个过程是通过一个堆栈的机制来实现的。为自动变量分配内存就压栈,而函数返回时就退栈。
/* auto */
#include <stdio.h>

int main()
{
int print();
int var,i;
for(i=0;i<=10;i++)
var=print();
printf("%d\n",var);
return 0;
}

int print()
{
auto int i=0; /* 自动变量 */
i+=1;
printf("%d\n",i);
return i;
}

/* end */

静态变量:
静态变量与自动变量的本质区别是,静态变量并不像自动变量那样使用堆栈机制来使用内存。而是为静态变量分配固定的内存,在程序运行的整个过程中,它都会被保持,而不会不销毁。这就是说静态变量的持续性是程序运行的整个周期。这有利于我们共享一些数据。如果静态变量在函数内部定义,则它的作用域就是在这个函数内部,仅在这个函数内部使用它才有效,但是它不同于自动变量的,自动变量离开函数后就会别销毁,而静态变量不会被销毁。他在函数的整个运行周期内都会存在。在函数外面定义的变量为全局变量,工程内的所有文件都可以访问他,但是它在整个工程内只能定义一次,不能有重复的定义,不然就会发生错误,而其他的文件要想使用这个变量,必须用extern来声明这个变量,这个声明叫做引用声明。这一点很重要,如过你没有用extern 来声明在其他文件中已经定义的全局变量,就来使用它,就会发生错误如果你只是想在定义他的文件中使用它,而不允许在其他的文件中使用它,那么就用关键字 static来在函数外面声明变量。这样这个变量在其他文件中将不可见,即它的连接性而内部链接。有一点是我们只得注意的像:如果你在函数外这样声明一个变量,const int a ; 变量a的连接性为内部链接,只能在定义他的文件内使用。还有如果你在定义静态变量的时候并没有给变量初始化,则静态变量将被自s动初始化为0;

/* static */
#include <stdio.h>

int main()
{
int print();
int var,i;
for(i=0;i<=10;i++)
var=print();
printf("%d",var);
return 0;
}

int print()
{
static int i; /*静态变量 */
i+=1;
printf("%d\n",i);
return i;
}

/* end */

寄存器变量:
在c语言当中可以使用寄存器变量来优化程序的性能,最常见的是在一个函数体当中,将一个常用的变量声明为寄存器变量: register int ra; 如果可能的话,编译器就会为它分配一个单独的寄存器,在整个函数执行期间对这个变量的操作全都是对这个寄存器进行操作,这时候就不用频繁地去访存了,自然就提高了性能.但是寄存器变量不是强制性的,也就是,即使你使用register关键字去声明一个变量为寄存器变量,编译器还是有可能把它作为一个普通的变量而不是寄存器变量来使用的. 在我们写程序的过程当中,有时候会经常用到一个全局变量,如果能够把它作为寄存器变量来使用,显然可以提高程序的性能,特别是对于那些对性能要求比较高的程序(比如模拟器,虚拟机等).拿X86平台来说,如果使用Gcc扩展,可以按照如下方式声明一个全局寄存器变量,并指定它存入ebx寄存器:int ra asm("ebx");用作这种用途的还有“ebp, ebx, esi, edi".这时候需要在编译程序的时候给出特别的选项,因为有些寄存器原本是另有用途的,比如ebp寄存器,原来是做frame-pointer用.

易失变量:
volatile:(嵌入式程序员必须掌握的)volatile最初的意思是表示汽油容易挥发,在c中的作用大概有两点(1)表示变量是易失的,易变的. (2)强制访存操作,防止编译器去优化,告诉编译器每次必须去内存中取值,而不是从寄存器或者缓存.
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
vivo手机手机主板坏了得多少钱维修 冷冻狮子头的做法 台式电脑显示器怎么选?27寸2k显示器性价比之王! 27寸4k和2k区别大不大?27寸高性价比显示器推荐! 2024年,热门27寸,2K,144Hz+高刷新游戏显示器推荐。3060TI,3070显卡搭 ... 27寸的2k高刷显示器,预算2000,推荐哪款? 27寸2k显示器推荐排行榜 预算2000,有没有27寸2k显示器推荐? 利用PS搞定一寸照及排版 男性更年期有哪些前兆? C语言 局部变量和自动变量的区别是什么?请简单举例子说明一下 谢谢 C语言中自动变量是什么变量?它是动态变量的意思吗?怎么理解? 自动变量属于局部变量么 电大全名是什么?函授学历是不是国家承认的 用SIMCA13怎么做OPLS-DA图 哪位大神有SIMCA-P软件啊,做偏最小二乘法分析 2022年高考中,英语是不是主科?满分是不是150分 simca p破解版 如何用SIMCA-P进行PLS-DA分析 安徽高考英语怎么算分? 太重,太大的CPU散热器会把主板拉变形,甚至拉坏吗? 散热器很重压着cpu会不会有影响? CPU散热器太重会不会拉弯主板? CPU散热器重会压坏主板吗?/?现在的散热器个头都很大 又重 CPU散热器过重会不会让压坏主板 如何解决cpu散热器过重导致主板变形问题 CPU风扇很重会给CPU和主板带来影响吗? CPU散热器太重会使主板变形吗? Simca14.1中的缺失值是怎么处理的? 用simca-p做回归结果不能复制怎么办 函授和电大有什么区别?谁的认可度大?哪个有脱产班? 质数一定是整数吗?可以是小数吗? 质数和合数是不是都是正整数 质数必须是整数吗 C语言中的自动变量和寄存器变量是什莫? 质数又称素数,一定是正整数(除了1)吗? 质数和合数都是正数对吗? 在C语言中,局部变量的存储类别自动默认为( ) 质数的含义? 质数是奇数吗? 什么浏览器最好用?并且较多人用? 说明全局变量,局部变量,静态变量,自动型变量的含义和区别 C语言中 自动变量 静态变量 寄存器变量 外部变量 有可比性吗?区别在哪?简单易懂点吧~ 自然数包括质数 合数 1和 0么?还是 实数?质数合数可以为负数么?必须是整数么? 请用自己的话解释全局变量与局部变量的区别,静态变量与自动变量的区别... 什么是有理数?质数?实数?自然数?整数? 什么是素数和质数? 你好。请问-13是质数吗?是整数吗? 质数 合数都是正整数吗 自动变量属于局部变量吗? 判断题? 请说明理由。