C语言关键字之register

版权声明:本文为小生原创,转载请注明出处,好吗好的,善哉善哉!!! https://blog.csdn.net/u010650845/article/details/79650542

1. Register关键字

register 关键字暗示编译程序相应的变量将会被频繁的使用,如果可能的话,应将其保存在 CPU 的寄存器中,以加快其存取速度,例如下面的代码:

/* Procedure for the assignment of structures, */

/* if the C compiler doesn't support this feature */

#ifdef NOSTRUCTASSIGN

memcpy ( d, s, i ){

    register char *d;
    register char *s;
    register int i;

    while( i-- ) { 
        *d++ = *s++;
    }
}

#endif

1.1. Register限制

  • register 声明的变量必须是能被 CPU 所接受的类型。
    这通常意味着 register 变量必须是一个单个的值,并且长度应该小于或者等于整型的长度。不过,有些机器的寄存器也能存放浮点数。

  • 因为 register 变量可能不存放在内存中,所以不能用 “&” 来获取 register 变量的地址。

  • 只有局部自动变量和形式参数可以作为寄存器变量,其它(如全局变量)不行。
    在调用一个函数时占用一些寄存器以存放寄存器变量的值,函数调用结束后释放寄存器。此后,在调用另外一个函数时又可以利用这些寄存器来存放该函数的寄存器变量,而全局变量会一直占用寄存器

  • 局部静态变量不能定义为寄存器变量,不能写成:register static int a, b, c;

  • 由于寄存器的数量有限(不同的 CPU 寄存器数目不一),不能定义任意多个寄存器变量,而且某些寄存器只能接受特定类型的数据(如指针和浮点数),因此真正起作用的 register 修饰符的数目和类型都依赖于运行程序的机器,而任何多余的 register 修饰符都将被编译程序所忽略。


1.2. 合理使用Register

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

猜你喜欢

转载自blog.csdn.net/u010650845/article/details/79650542