还剩1页未读,继续阅读
文本内容:
静态变量、自动变量与寄存器变量的存储什么是寄存器?什么是寄存器变量?寄存器是中央处理器内的组成部分寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和位址在中央处理器的控制部件中,包含的寄存器有指令寄存器IR和程序计数器PC o在中央处理器的算术及逻辑部件中,包含的寄存器有累加器C寄存器是内存阶层中的最顶端,也是系统获得操作诩的最快速途径寄存器通常都是以他们可以保存的位元数量来估量,举例来说,一个“8位元寄存器”或“32位元寄存器”寄存器现在都以寄存器档案的方式来实作,但是他们也可能使用单独的正反器、高速的核心内存、薄膜内存以及在数种机器上的其他方式来实作出来寄存器通常都用来意指由一个指令之输出或输入可以直接索引到的暂存器群组更适当的是称他们为“架构寄存器”寄存器是空L内部的元件,寄存器拥有非常高的读写速度,所以在寄存器之间的数据传送非常快register[寄存器]变量告诉编译器相关的变量应该改量存储在高速度的寄存器中使用register存储类型的目的一般是为了提高执行速度,但是,register声明只是向编译器所提出的“建议”,并非强制要求寄存器型变量register限定词通知编译器一程序中的变量将频繁使用它的意思是建议编译器将程序中用register限定的变量放置在计算机的内部寄存其中,这样可能得到更小更快的程序但是,编译器将根据实际情况考虑是否采纳该建议一是否将register变量处理为寄存器变量最终决定权还是在编译器如下使用register register int x;/*x必须是内部变量*/register charch;/*ch必须是内部变量*/register只能用于限定自动型变量和函数的形式参数也就是说register只对内部变量起作用,而且只能限定内部非静态型变量,不能限定内部静态型变量register也可以应用于形式参数,格式如下f registerunsigned m,register longn/register应用于形式参数*/registerinti;/*register应用于内部变量*/在传统C中,register变量的使用有诸多限制,它决定于硬件的实现方式在每一个函数中只有少数几个变量可以保存在寄存器中,而且也只有特定的类型才行过量的register变量看起来是无害的,但是超量以后,编译器将忽略新的register变量另外不管register变量实际上是否被编译器设置为寄存器型变量,都不可能取得该变量的地址寄存器型变量的类型和数量的多少随计算机不同而异register变量一般只能够设置儿个传统C的register类型限定于char、int等类型像float、double,数组等是不可以设定为register型变量的但是,在最新C99标准中,任何类型都可以定义为register变量,register声明的目的只是告诉编译器以尽快的速度处理该变量,编译器不见得非把它处理为register变量,
4、a/j rcna A7■cIn*』.//10**I1MB11rIfgIIIIIJI«Jw*Z for var i=0;i100;i++3var ol={4s:asdf,5x:
13.37};67for vart=0;i100;i++8var oZ={9s:,fasdF\10y£111};13function fa,b{14let p=b;15for;p.s0;p=p.s16while p-p{17forvari=O;i10000000;++i{}18return a.x;静态变量、自动变量与寄存器变量的存储
一、我们声明的变量有几类?变量的存储位置与变量的类型有关,这里变量的类型不是int、float之类的类型,而是分为三类静态变量、自动变量和寄存器变量然而,变量到底属于这三类中的哪一类是根据变量在源文件中的声明位置和声明方式所决定的
二、这三类变量分别是怎么存储的存储类型?变量的存储类型st21age class是指存储变量值的内存类型变量的存储类型决定变量何时创建、何时销毁以及它的值将保持多久有三个地方可以用于存储变量静态内存、运行时堆栈、硬件寄存器在这三个地方存储的变量具有不同的特性1存储在静态内存的变量凡是在任何代码块之外声明的变量总是存储于静态内存中,也就是不属于堆栈的内存,这类变量也叫静态stat运变量对于这类变量,你无法为它们指定其他存储类型静态变量的生存期静态变量在程序运行之前创建,在整个程序执行期间始终存在2存储在堆栈内存的变量在代码块内部声明的变量的缺省存储类型是自动的automatic,也就是说它存储于堆栈中,这类变量叫自动auto变量,也叫局部变量有一个关键字auto就是用于修饰这种类型的,但它极少使用,因为代码块中的变量缺省就是自动变量自动变量的生存期在程序执行到声明自动变量的代码块时,自动变量才被创建,当程序的执行流离开该代码块时,这些自动变量便自行销毁如果该代码块被执行多次,例如一个函数被执行多次,其内部的自动变量也就被重新创建多次而且每次被创建的内存地址可能不同3代码块中的静态变量对于在代码块内部声明的变量,缺省为自动变量,但如果给它加上关键字static,可以使它的存储类型从自动变为静态这类变量也叫做静态局部变量,存储在静态内存中静态局部变量的生存期代码块首次执行时创建该变量,直到整个程序结束注意虽然存储类型发生变化,但它的作用域并为改变,它仍然只能在该代码块内部通过变量名访问函数的形式参数不能声明为静态,因为实参总是在堆栈中传递给函数,用于支持递归4在硬件寄存器中的变量关键字register可以用于自动变量的声明,提示它们应该存储于机器的硬件寄存器而不是内存中,这类变量称为寄存器变量通常,寄存器变量比存储于内存的变量访问起来效率更高注意声明为寄存器变量只是一种美好的愿望二八,因为编译器不一定会理你!因为寄存器就那么几个,要是太多变量被声明为register,它可不会都放进寄存器它一般只选取前几个实际存储于寄存器中,其余的原来怎样还怎样如果有些编译器自己具有一套寄存器优化方案,他也可能忽略register关键字,依据是由编译器决定哪些变量存储于寄存器比你人脑的决定更为合理。