register关键字详解

前言:

编译器的优化很大程度上就是通过数据流分析、调整读取内存的顺序等,减少CPU对内存的读写。因为内存的运行速度相对于CPU是很慢的,计算机中添加cache就是为了解决CPU和内存运行速度差异过大的问题。就运行速度来说:寄存器>cache>内存>外存;就价格来说刚好相反:寄存器>cache>内存>外存。这也是寄存器和cache的读取速度最快,但是计算机中寄存器和cache的容量却很小的原因, 你可以买到1T的硬盘但是没买不到1T的内存条,价格太高,有也买不起。寄存器的数量和功能在Soc中是固定的,后期没法扩展,寄存器资源是稀缺的,对寄存器的操作要谨慎。

register关键字的作用

用register关键字修饰变量,就是编译程序时希望把该变量放到寄存器中,这样可以提高对该变量的访问速度。由前言可知,CPU访问寄存器的速度是高于访问内存的速度。

register关键字的应用场景

当一个变量会被频繁调用时,可以用register去修饰变量,将变量保存在寄存器中,可以提升访问变量的速度。

register关键字的注意事项

register int abc = 0printf("&abc=%p\n", &abc);

1.register变量必须是能被CPU所接受的类型。变量保存在寄存器中,那表示变量的程度不能超过寄存器的位数并且类型要和寄存器接受的数据类型一致。通常情况register修饰的变量必须是一个单个的值,并且长度应该小于或者等于整型的长度。如果寄存器允许存放浮点数,那register修饰的变量也可以是浮点数。
2.因为register变量可能不存放在内存中,所以不能用“&”来获取register变量的地址用register修饰的变量是不一定会存放在寄存器中的,用register修饰只是建议将该变量保存到寄存器,并不是强制性的。至于为什么不能用"&"来取地址我是有疑问的,ARM是统一编址,寄存器和内存一样都是通过地址访问,在访问方式上来说,寄存器和内存是一样的。用register修饰的变量不存放在内存来解释不能用“&”来获取register变量的地址,我不理解,有知道原因的大佬欢迎指教。不过确实不能用“&”来获取register变量的地址,原因是编译通不过。上面的代码在编译时会报错:
error: address of register variable ‘abc’ requested
3.局部静态变量不能定义为寄存器变量。不能写成:register static int a, b, c。我猜测原因是:静态变量的生命周期和整个程序的生命周期是一样的,总不能分配一个寄存器一直被一个变量占用,寄存器资源是很宝贵的,这样太浪费。
4.不能定义任意多个寄存器变量,原因很简单Soc的寄存器太少了。就算你用register修饰都不一定会放在寄存器中,更别说还要定义多个。个人觉得,这些特殊的关键字,没十足的把握就别使用,现在编译器已经很智能了,编译器知道该如何优化代码。对于我这样的普通人,知道这些关键字的含义,在看到Linux内核代码时,知道这些关键字修饰起什么作用就行了。

你可能感兴趣的:(C语言)