×
FPGA/DSP > DSP系统 > 详情

静态变量、自动变量与寄存器变量的存储

发布时间:2020-05-15 发布时间:
|

什么是寄存器?什么是寄存器变量?

寄存器是中央处理器内的组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和位址。在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC)。在中央处理器的算术及逻辑部件中,包含的寄存器有累加器(ACC)。寄存器是内存阶层中的最顶端,也是系统获得操作资料的最快速途径。寄存器通常都是以他们可以保存的位元数量来估量,举例来说,一个 “8 位元寄存器”或 “32 位元寄存器”。寄存器现在都以寄存器档案的方式来实作,但是他们也可能使用单独的正反器、高速的核心内存、薄膜内存以及在数种机器上的其他方式来实作出来。 寄存器通常都用来意指由一个指令之输出或输入可以直接索引到的暂存器群组。更适当的是称他们为 “架构寄存器”。寄存器是CPU内部的元件,寄存器拥有非常高的读写速度,所以在寄存器之间的数据传送非常快。

register[寄存器]变量告诉编译器相关的变量应该改量存储在高速度的寄存器中。使用register存储类型的目的一般是为了提高执行速度,但是,register声明只是向编译器所提出的“建议”,并非强制要求。

寄存器型变量

register限定词通知编译器--程序中的变量将频繁使用。它的意思是建议编译器将程序中用register限定的变量放置在计算机的内部寄存其中,这样可能得到更小更快的程序。但是,编译器将根据实际情况考虑是否采纳该建议--是否将register变量处理为寄存器变量最终决定权还是在编译器。

如下使用register:

register int x;/*x必须是内部变量*/

register char ch;/*ch必须是内部变量*/

register只能用于限定自动型变量和函数的形式参数。也就是说register只对内部变量起作用,而且只能限定内部非静态型变量,不能限定内部静态型变量。

register也可以应用于形式参数,格式如下:

f(register unsigned m,register long n) /*register应用于形式参数*/

{

register int i; /* register应用于内部变量*/

}

在传统C中,register变量的使用有诸多限制,它决定于硬件的实现方式。在每一个函数中只有少数几个变量可以保存在寄存器中,而且也只有特定的类型才行。过量的register变量看起来是无害的,但是超量以后,编译器将忽略新的register变量。另外不管register变量实际上是否被编译器设置为寄存器型变量,都不可能取得该变量的地址。寄存器型变量的类型和数量的多少随计算机不同而异。register变量一般只能够设置几个。传统C的register类型限定于char、int等类型。像float、double、数组等是不可以设定为register型变量的。但是,在最新C99标准中,任何类型都可以定义为register变量,register声明的目的只是告诉编译器以尽快的速度处理该变量,编译器不见得非把它处理为register变量。

静态变量、自动变量与寄存器变量的存储

一、我们声明的变量有几类?

变量的存储位置与变量的类型有关,这里变量的类型不是int、float之类的类型, 而是分为三类:静态变量、自动变量和寄存器变量。

然而,变量到底属于这三类中的哪一类是根据变量在源文件中的声明位置和声明方式所决定的。

二、这三类变量分别是怎么存储的(存储类型)?

变量的存储类型(storage class)是指存储变量值的内存类型。变量的存储类型决定变量何时创建、何时销毁以及它的值将保持多久。有三个地方可以用于存储变量:静态内存、运行时堆栈、硬件寄存器。在这三个地方存储的变量具有不同的特性。

(1)存储在静态内存的变量

凡是在任何代码块之外声明的变量总是存储于静态内存中,也就是不属于堆栈的内存,这类变量也叫静态(static)变量。对于这类变量,你无法为它们指定其他存储类型。

静态变量的生存期:静态变量在程序运行之前创建,在整个程序执行期间始终存在。

(2)存储在堆栈内存的变量

在代码块内部声明的变量的缺省存储类型是自动的(automatic),也就是说它存储于堆栈中,这类变量叫自动(auto)变量,也叫局部变量。有一个关键字auto就是用于修饰这种类型的,但它极少使用,因为代码块中的变量缺省就是自动变量。

自动变量的生存期:在程序执行到声明自动变量的代码块时,自动变量才被创建,当程序的执行流离开该代码块时,这些自动变量便自行销毁。

如果该代码块被执行多次,例如一个函数被执行多次,其内部的自动变量也就被重新创建多次。而且每次被创建的内存地址可能不同。

(3)代码块中的静态变量

对于在代码块内部声明的变量,缺省为自动变量,但如果给它加上关键字static,可以使它的存储类型从自动变为静态。这类变量也叫做静态局部变量,存储在静态内存中。

静态局部变量的生存期:代码块首次执行时创建该变量,直到整个程序结束。

注意:虽然存储类型发生变化,但它的作用域并为改变,它仍然只能在该代码块内部通过变量名访问。函数的形式参数不能声明为静态,因为实参总是在堆栈中传递给函数,用于支持递归。

(4)在硬件寄存器中的变量

关键字register可以用于自动变量的声明,提示它们应该存储于机器的硬件寄存器而不是内存中,这类变量称为寄存器变量。通常,寄存器变量比存储于内存的变量访问起来效率更高。

注意:声明为寄存器变量只是一种美好的愿望 ^_^,因为编译器不一定会理你!

因为寄存器就那么几个,要是太多变量被声明为register,它可不会都放进寄存器。它一般只选取前几个实际存储于寄存器中,其余的原来怎样还怎样。 如果有些编译器自己具有一套寄存器优化方案,他也可能忽略register关键字,依据是由编译器决定哪些变量存储于寄存器比你人脑的决定更为合理 ←_← !


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机系统电磁兼容的三个条件