0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

浅析C语言中的regiseter关键字

学益得智能硬件 来源:学益得智能硬件 2023-08-25 17:10 次阅读

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,并没有效果。






审核编辑:刘清
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    31

    文章

    5305

    浏览量

    119916
  • C语言
    +关注

    关注

    180

    文章

    7597

    浏览量

    136023
  • 缓存器
    +关注

    关注

    0

    文章

    63

    浏览量

    11646
  • for循环
    +关注

    关注

    0

    文章

    61

    浏览量

    2490

原文标题:regiseter关键字

文章出处:【微信号:学益得智能硬件,微信公众号:学益得智能硬件】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C语言关键字const的几种用法

    本期来讲解一个C语言关键字——const。
    发表于 06-21 11:05 1552次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b><b class='flag-5'>关键字</b>const的几种用法

    static 关键字

    static 关键字 浅析
    发表于 01-16 16:55

    C语言volatile关键字详解 精选资料分享

    1.volatile和什么有关百度翻译是这样子翻译volatile的:图1-1 百度翻译volatile截图volatile属于C语言关键字,《C Primer Puls》 是这样解
    发表于 07-22 07:20

    C语言中关键字static的作用是什么

    C语言中关键字static的作用是什么?用预处理指令#define 声明一个函数,输入天数得到有多少秒?
    发表于 12-24 06:53

    C语言中的volatile关键字

    volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改。
    发表于 05-27 09:32 3264次阅读

    单片机C语言中常用到的关键字及数据类型

    单片机C语言中常用到的关键字及数据类型。
    发表于 11-03 10:57 13次下载

    标准C语言总共有32个关键字

    标准C语言总共有32个关键字
    发表于 01-12 15:59 0次下载

    C语言32个关键字

    C语言32个关键字,感兴趣的小伙伴们可以看看。
    发表于 07-26 16:29 66次下载

    C语言中关键字

    C语言中的入门教程
    发表于 10-14 16:24 3次下载

    浅析C语言中typedef关键字的作用

    C 语言提供了 typedef 关键字,您可以使用它来为类型取一个新的名字。
    的头像 发表于 11-08 08:42 5958次阅读

    【嵌入式】C语言中volatile关键字

    volatile06. 附录01. volatile概述volatile是C语言中的一个关键字。将变量定义为volatile就表示告诉编译器这个变量可能会被竟想不到地改变,在这种情况下,编译器就不会去假设这个变量的值了,及优化器
    发表于 10-21 10:21 6次下载
    【嵌入式】<b class='flag-5'>C</b><b class='flag-5'>语言中</b>volatile<b class='flag-5'>关键字</b>

    C语言中__attribute__ 关键字的用法

    嵌入式开发,离不开 C 语言C语言中有很多语法会直接或间接影响你代码的质量,下面就来讲讲__attribute__ 关键字的用法。 1.
    发表于 10-19 09:06 1.2w次阅读

    C语言32个关键字可以分为这几类

    C语言是一种面向过程、抽象化的通用程序设计语言,广泛应用于嵌入式底层和系统开发。C语言关键字共有
    的头像 发表于 12-31 15:28 4936次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>32个<b class='flag-5'>关键字</b>可以分为这几类

    快速掌握C语言关键字

    C语言中的32个关键字你知道多少个呢?根据关键字的作用分为四类:数据类型关键字、控制语句关键字
    的头像 发表于 07-06 08:04 291次阅读
    快速掌握<b class='flag-5'>C</b><b class='flag-5'>语言</b><b class='flag-5'>关键字</b>

    C语言关键字--typedef

    C语言关键字使用方法学习指南!
    的头像 发表于 10-07 12:44 163次阅读