网站首页 全球最实用的IT互联网站!

人工智能P2P分享Wind搜索发布信息网站地图标签大全

当前位置:诺佳网 > 电子/半导体 > 嵌入式技术 >

浅析C语言中的regiseter关键字

时间:2023-08-25 17:10

人气:

作者:admin

标签:

导读:C语言中重要的关键字有很多,static const extern我们之前都讲过,还有一个在面试中出现的频率也比较高:register。...

C语言中重要的关键字有很多,static const extern我们之前都讲过,还有一个在面试中出现的频率也比较高:register。

register翻译过来是寄存器的意思,可以在定义变量的时候加在前面,我们把它称作寄存器变量。

寄存器变量的作用在于提高程序的运行效率。

我们经常用到的存储介质大概有这么几种,硬盘、内存、缓存、寄存器,越往上访问速度越快,当然价格也越高。

d07e1196-4326-11ee-a2ef-92fbcf53809c.png  

运行程序的时候,计算机会把大部分的数据存放在内存中,然后CPU会从内存中读取需要的数据。

虽然访问内存的速度比访问硬盘来的快,但是跟CPU的速度比起来,还是慢了很多。

于是C语言就有了register关键字,被register修饰的变量很有可能放在寄存器中,这样,CPU就能直接从寄存器中读取变量,提高程序的运行效率。

对于需要频繁访问的变量,可以把它声明成寄存器变量。

写个代码试试:

int main()
{
    int i;
for(i= 0; i < 10000000; i++);
    
    printf("helloworld
");
    
    return 0;
}
i作为循环变量,会被频繁访问。

先是不加register,编译的时候不优化。
root@Turbo:test# gcc test.c -o test -O0
root@Turbo:test#
如果不加这个-O选项,有些编译器可能把这样的for循环当作废话优化掉。

运行的时间大概是这样的:
root@Turbo:test# time ./test 
hellowrold


real  0m0.021s
user  0m0.020s
sys  0m0.000s
root@Turbo:test#
然后修改代码,在i的前面加上register:
int main()
{
    register int i;
    for (i = 0; i < 10000000; i++);
    
    printf("helloworld
");
    
    return 0;
}
再次编译运行,时间确实会缩短很多:
root@Turbo:test# gcc test.c -o test -O0
root@Turbo:test# time ./test 
hellowrold


real  0m0.004s
user  0m0.000s
sys  0m0.004s
root@Turbo:test#
关于register关键字,有个经典的面试题,就是寄存器变量不能做取地址操作?
register int i;
&i;
C语言中的取地址操作取的是内存的地址,变量放在寄存器中不存在地址这一说法,如果强行取地址,编译就会报错。
root@Turbo:test# gcc test.c -o test -O0
test.c: In function ‘main’:
test.c:8:2: error: address of register variable ‘i’ requested
    8 |  &i;
      |  ^
root@Turbo:test#
最后,register关键字还容易存在一个误区:既然register能提高程序的运行效率,那能不能把所有的变量都声明成register?

这个肯定不行,因为寄存器容量毕竟有限,声明的太多,寄存器根本放不下。

所以少量的还行,都声明成register,并没有效果。






审核编辑:刘清
温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信