c进阶篇(七)——register用法详解

前言:
  register是c的关键字,但目前已经鲜少人使用它了。

1 register介绍

 &emps; register 被用于修饰函数局部变量和形参,因此register变量属于动态存储。通常的变量被存储在RAM中,访问RAM中的变量需要CPU对内存寻址访问,而register变量被存储在CPU内部的寄存器中提高了变量的访问速度,但CPU的寄存器数量是有限的(定义太多将会超出容量),因此应尽量减少register的使用。因为具有更高的访问效率及资源的稀缺性,应当优先将频繁读写的变量定义为register变量,比如c循环中频繁访问的变量,如用于循环计数的变量。register只是一个”建议“性的关键字,被register修饰的变量并不一定会被编译器存储在CPU内部寄存器中,只是对编译器优化的一个”建议“,最终如何存储取决于编译器。当今编译器的功能已经十分强大,它能够自动帮你完成这些优化,因此现在很少有人使用register关键字了。被register修饰的变量不能被 & 运算符寻址,由于其可能并不存储在内存中,因此对其寻址将会触发编译器报错。

2 修饰变量

  以下是对 register 关键字使用的具体距离。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//register byte g_byVal = 0u; //错误,不能作全局变量。

dword Fun1(register byte byParam) //作形参变量。
{
register byte byTmp = 0u; //作局部变量。

return byParam + byTmp;
}

dword Fun2(register const byte c_byParam) //作形参与const搭配。
{
register const byte c_byTmp = 0u; //作局部变量与const搭配。

return c_byParam + c_byTmp;
}

//dword Fun3(register static byte s_byParam) //错误,作形参不能与static搭配。
//{
// register static byte s_byTmp = 0u; //错误,作局部变量不能与static搭配。
//
// return s_byParam + s_byTmp;
//}

int32_t main(void)
{
register byte byTmp = 0u; //作局部变量。

Fun1(byTmp);
Fun2(byTmp);
//Fun3(byTmp);
//printf("%x\n", &byTmp); //错误,不能对register变量取地址。

while(1u);
}