register修饰符暗示编译程序相应的变量将被频繁使用,如果可能的话,应将其保存在CPU的寄存器中,以加快其存储速度
例如:memcpy(des,src,i)
{
register char * des;
register char * src;
while(i--)
{
*des++ = *src++;
}
}
使用register修饰符的限制:
1、register 必须是能被CPU所能接收的类型,这意味着register变量必须是单个的值,并且长度应该小于或者等于整形的长度,不过有些机器也是可以存储浮点型的;
2、register 变量可能不存在内存中,所以不能通过&来获取register变量的地址;
3、只有局部自动变量和形式参数可以作为寄存器变量,其他(入全局变量)不行;//在调用一个函数在占用了一些寄存器以存放寄存器的变量的值,函数结束释放寄存器,此后,在调用另外一个函数时又可以利用这些寄存器存放这些寄存器变量的值,函数结束释放寄存器
4、局部静态变量不能定义寄存器变量,不能写成register static int a,b,c;
5、由于寄存器的数量有限(不同的CPU的寄存器数量不同),不能定义任意多个寄存器变量,而某些寄存器只能接受指定类型的数据,如指针、浮点数;因此真正起作用的register修饰符的数目和类型都依赖于运行程序的机器,任何多余的register修饰符都会被编译器缩忽略;
注意:
早期的C编译程序不会把变量保存在寄存器中,除非你命令它这样做,这时register修饰符是C语言的一种很有价值的补充。然而,随着编译程序设计技术的进步,在决定哪些变量应该被存到寄存器中时,现在的C编译环境能比程序员做出更好的决定。实际上,许多编译程序都会忽略register修饰符,因为尽管它完全合法,但它仅仅是暗示而不是命令。