Linux register 关键字简介

转载 2015年07月10日 11:32:52
这里还是稍微先一下auto这个关键字吧
auto:它很宽恒大量的,你就当它不存在吧。编译器在默认的缺省情况下,所有变量都是auto 的。一语代过。。。
register:这个关键字请求编译器尽可能的将变量存在CPU 内部寄存器中而不是通过内存寻址访问以提高效率。注意是尽可能,不是绝对。你想想,一个CPU 的寄存器也就那么几个或几十个,你要是定义了很多很多register 变量,它累死也可能不能全部把这些变量放入寄存器吧,轮也可能轮不到你。
皇帝身边的小太监----寄存器
不知道什么是寄存器?那见过太监没有?没有?其实我也没有。没见过不要紧,见过就麻烦大了。^_^,大家都看过古装戏,那些皇帝们要阅读奏章的时候,大臣总是先将奏章交给皇帝旁边的小太监,小太监呢再交给皇帝同志处理。这个小太监只是个中转站,并无别的功能。
那我们再联想到我们的CPU。CPU 不就是我们的皇帝同志么?大臣就相当于我们的内存,数据从他这拿出来。那小太监就是我们的寄存器了(这里先不考虑CPU 的高速缓存区)。数据从内存里拿出来先放到寄存器,然后CPU 再从寄存器里读取数据来处理,处理完后同样把数据通过寄存器存放到内存里,CPU 不直接和内存打交道。这里要说明的一点是:小太监是主动的从大臣手里接过奏章,然后主动的交给皇帝同志,但寄存器没这么自觉,它从不主动干什么事。一个皇帝可能有好些小太监,那么一个CPU 也可以有很多寄存器,不同型号的CPU 拥有寄存器的数量不一样。
为什么要这么麻烦呢?速度!就是因为速度。寄存器其实就是一块一块小的存储空间,只不过其存取速度要比内存快得多。进水楼台先得月嘛,它离CPU 很近,CPU 一伸手就拿到数据了,比在那么大的一块内存里去寻找某个地址上的数据是不是快多了?那有人问既然它速度那么快,那我们的内存硬盘都改成寄存器得了呗。我要说的是:你真有钱!
register修饰符暗示编译程序相应的变量将被频繁地使用,如果可能的话,应将其保存在CPU的寄存器中,以加快其存储速度。例如下面的内存块拷贝代码,还是看看实例比较实在:
/* Procedure for the assignment of structures, */
/* if the C compiler doesn't support this feature */
#ifdef NOSTRUCTASSIGN
memcpy (d, s, l)
{
register char *d;
register char *s;
register int i;
while (i--)
*d++ = *s++;
}
#endif
但是使用register修饰符有几点限制
(1)register变量必须是能被CPU所接受的类型。这通常意味着register变量必须是一个单个的值,并且长度应该小于或者等于整型的长度。不过,有些机器的寄存器也能存放浮点数。最好不要这样去用
(2)因为register变量可能不存放在内存中,所以不能用“&”来获取register变量的地址。
(3)只有局部自动变量和形式参数可以作为寄存器变量,其它(如全局变量)不行。在调用一个函数时占用一些寄存器以存放寄存器变量的值,函数调用结束后释放寄存器。此后,在调用另外一个函数时又可以利用这些寄存器来存放该函数的寄存器变量。所以说不要用register修饰全局变量等,因为他长时间的占用寄存器不允许再被使用了。
(4)局部静态变量不能定义为寄存器变量。不能写成:register static int a, b, c,同样的道理,因为static变量函数结束不会被销毁,下面进入还会使用之前的数据,生命周期直到程序退出才结束,数据存放在静态区。
(5)由于寄存器的数量有限(不同的cpu寄存器数目不一),不能定义任意多个寄存器变量,而且某些寄存器只能接受特定类型的数据(如指针和浮点数),因此真正起作用的register修饰符的数目和类型都依赖于运行程序的机器,而任何多余的register修饰符都将被编译程序所忽略。

注意:
  早期的C编译程序不会把变量保存在寄存器中,除非你命令它这样做,这时register修饰符是C语言的一种很有价值的补充。然而,随着编译程序设计技术的进步,在决定哪些变量应该被存到寄存器中时,现在的C编译环境能比程序员做出更好的决定。实际上,许多编译程序都会忽略register修饰符,因为尽管它完全合法,但它仅仅是暗示而不是命令。
知道这个关键字就可以了,也许你没有必要去用他。

C++中register关键字

register:这个关键字请求编译器尽可能的将变量存在CPU内部寄存器中,而不是通过内存寻址访问,以提高效率。注意是尽可能,不是绝对。你想想,一个CPU 的寄存器也就那么几个或几十个,你要是定义了很...
  • liu537192
  • liu537192
  • 2015年12月06日 13:29
  • 4501

C语言关键字auto与register的深入理解

关键字,又叫保留字,是编译器能识别的特殊单词,每种计算机语言都会有其特定的关键字,C语言中有32位关键字。 问:为什么要有关键字? 答:关键字是程序设计中代码必须包含的部分,编译器在编译C代码的时...
  • u011625768
  • u011625768
  • 2015年07月02日 10:26
  • 1199

c语言之volatile和register关键字

//register.cpp #include #include #include int main1() { for(register int i=0;i
  • earbao
  • earbao
  • 2016年12月28日 00:10
  • 1147

register 关键字的作用

1.register修饰暗示编译程序相应的变量将被频繁使用的变量尽可能的将这个变量保存在CPU内部寄存器中而不是通过内存寻址来访问,是为了提升它的运行速率。 2、但是使用register修饰...
  • baidu_35534327
  • baidu_35534327
  • 2017年01月09日 22:10
  • 476

嵌入式开发基础----register和volatile关键字

register:       在函数内部定义变量时,默认是auto类型,即分配给变量内存。如果定义一个变量用register关键字,那么编译器尽可能把变量存放在CPU内部寄存器中,这样就不必通过内...
  • Ropai
  • Ropai
  • 2011年11月21日 20:13
  • 2798

关键字register

register 作用:请求编译器尽可能(CPU内部寄存器有限,不可能把所有变量保存在里面)的把变量存在CPU内部寄存器中(原因:把数据房子编译器中,省去了CPU从内存中抓取数据的时间,提高程序的运...
  • nopoppy
  • nopoppy
  • 2016年09月11日 21:10
  • 87

关键字register:

作用:请求编译器尽可能将此变量存在CPU内部的寄存器中,由于寄存器数量有限,所以这不是绝对的。 此外,还应该注意: ● register变量必须是一个单一的值,并且其长度应小于或等于整型的长...
  • qq_37924810
  • qq_37924810
  • 2017年10月28日 15:22
  • 48

register关键字,valatile关键字

register关键字,valatile关键字 一、register例子 register修饰符暗示编译程序相应的变量将被频繁地使用,如果可能的话,应将其保存在CPU的寄存器中...
  • ouyangjinbin
  • ouyangjinbin
  • 2016年04月05日 18:34
  • 222

register 关键字

register使用: 变量在CPU寄存器里面,而不是在内存里面。但regist是建议型的指令,而不是命令型的指令,当寄存器内部有足够的空间时,系统会把变量存入寄存器中而不是内存中,从而减少代码量,...
  • wanjilong123456
  • wanjilong123456
  • 2017年01月16日 14:57
  • 63

register关键字

register    寄存器变量           CPU组成:运算器   控制器    存储器(寄存器) register的作用:请求编译器把这个修饰变量尽可能放在CPU内部寄存器中,减少了...
  • lf1570180470
  • lf1570180470
  • 2016年12月19日 11:50
  • 181
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux register 关键字简介
举报原因:
原因补充:

(最多只允许输入30个字)