寄存器变量(寄存器变量的关键字)
大家好,相信到目前为止很多朋友对于寄存器变量和寄存器变量的关键字不太懂,不知道是什么意思?那么今天就由我来为大家分享寄存器变量相关的知识点,文章篇幅可能较长,大家耐心阅读,希望可以帮助到大家,下面一起来看看吧!
1编程里,自动变量和寄存器变量是怎么回事?
什么是自动变量呢?自动变量就是指在函数内部定义使用的变量。他只是允许在定义他的函数内部使用它。在函数外的其他任何地方都不能使用的变量。自动变量是局部变量,即它的区域性是在定义他的函数内部有效。当然这说明自动变量也没有链接性,因为它也不允许其他的文件访问他。由于自动变量在定义他的函数的外面的任何地方都是不可见的,所以允许我们在这个函数外的其他地方或者是其他的函数内部定义同名的变量,他们之间不会发生冲突的。因为他们都有自己的区域性,而且它没有链接性(即:不允许其他的文件访问他的)。来看看自动量的持续性。计算机在执行这个函数的时候,创建并为它分配内存,当函数执行完毕返回后,自动变量就会被销毁。这个过程是通过一个堆栈的机制来实现的。为自动变量分配内存就压栈,而函数返回时就退栈。
/* 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)强制访存操作,防止编译器去优化,告诉编译器每次必须去内存中取值,而不是从寄存器或者缓存.
2在变量寄存器中,变量什么为独立存储器
寄存器的功能是存储二进制代码,它是由具有存储功能的触发器组合起来构成的。一个触发器可以存储1位二进制代码,故存放n位二进制代码的寄存器,需用n个触发器来构成。下面小编给大家介绍一下“寄存器变量是什么变量 寄存器变量怎么用”
一、寄存器变量是什么变量
在程序运行时,根据需要到内存中相应的存储单元中调用,如果一个变量在程序中频繁使用,例如循环变量,那么,系统就必须多次访问内存中的该单元,影响程序的执行效率。因此,C语言\C++语言还定义了一种变量,不是保存在内存上,而是直接存储在CPU中的寄存器中,这种变量称为寄存器变量。
寄存器变量的定义形式是:
register 类型标识符 变量名
寄存器是与机器硬件密切相关的,不同类型的计算机,寄存器的数目是不一样的,通常为2到3个,对于在一个函数中说明的多于2到3个的寄存器变量,C编译程序会自动地将寄存器变量变为自动变量。
由于受硬件寄存器长度的限制,所以寄存器变量只能是char、int或指针型。寄存器说明符只能用于说明函数中的变量和函数中的形参,因此不允许将外部变量或静态变量说为"register"。
register型变量常用于作为循环控制变量,这是使用它的高速特点的最佳场合。
register[寄存器]变量告诉编译器相关的变量应该改量存储在高速度的寄存器中。使用register存储类型的目的一般是为了提高执行速度,但是,register声明只是向编译器所提出的“建议”,并非强制要求。

(图片来源于互联网)
二、寄存器变量怎么用
以下为一个寄存器变量的声明:
register int variable;
寄存器变量:如果访问过于频繁,可使用此变量直接从寄存器访问。
eg.
#include stdio.h /*编译预处理指令*/
int sum ( int n );
/*一个函数声明语句,sum(...)是一个名字叫sum的函数声明,前边的int说明该函数的返回值是整型;(int n)说明传递函数的形参是一个整型变量*/
int main () /*主函数的函数头*/
{
int i , s; /*定义整型变量i,s*/
for ( i=1 ; i = 5 ; i++ )
/*循环语句,首先执行 i = 1;
赋初值,再执行 i =5;
判断是否符合条件,如果符合就执行 { } 里循环体的语句,执行完后,再执行 i ++ 运算,i ++ 等价于 i = i +1;
再执行 i = 5 进行条件判断,如果符合就执行 { } 里循环体的语句,不符则跳出循环*/
printf ( " 前 % d 个自然数的和是 % d \n ", i, sum ( i ) );
/*第一个 % d 对应的是 i ,第二个 %d 对应的是 sum ( i ),sum ( i )是一个函数,返回值是int ;
第二个 % d 是整型的,所以第二个 sum ( i ) 返回前 i 项和*/
int sum ( int n )
/*定义一个返回值是整型的函数 sum ,它接受一个整型参数变量n*/
{
register int i , s = 0 ; /*定义寄存器变量*/
for ( i = 1 ; i = n ; i ++ ) /*循环 n 次 */
s + = i ; /*赋值语句,等价于 s = s + i */
return s ; /*函数返回值*/
}
写此程序的目的:测试寄存器变量的用法,像以上内容,如果频繁访问 i 的值,则可以使用寄存变量。
register要与不要的区别:
凡是声明为 register 的变量,操作系统都会企图将其放入寄存器中以加快速度,如果寄存器中满了,则将由计算机硬件将寄存器中最久未使用的变量调入到高速缓冲存储器(Cache) 中,同时放入你的变量。
寄存器是CPU的一部分,所以其访问速度会远远高于同内存的访问速度。

3什么是寄存器?什么是寄存器变量?
寄存器是中央处理器内的组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和位址。在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC)。在中央处理器的算术及逻辑部件中,包含的寄存器有累加器(ACC)。寄存器是内存阶层中的最顶端,也是系统获得操作资料的最快速途径。寄存器通常都是以他们可以保存的位元数量来估量,举例来说,一个 “8 位元寄存器”或 “32 位元寄存器”。寄存器现在都以寄存器档案的方式来实作,但是他们也可能使用单独的正反器、高速的核心内存、薄膜内存以及在数种机器上的其他方式来实作出来。 寄存器通常都用来意指由一个指令之输出或输入可以直接索引到的暂存器群组。更适当的是称他们为 “架构寄存器”。寄存器是CPU内部的元件,寄存器拥有非常高的读写速度,所以在寄存器之间的数据传送非常快。
register[寄存器]变量告诉编译器相关的变量应该改量存储在高速度的寄存器中。使用register存储类型的目的一般是为了提高执行速度,但是,register声明只是向编译器所提出的“建议”,并非强制要求。
关于寄存器变量的内容到此结束,希望对大家有所帮助。