前言

本文用简单代码实验介绍register关键字的使用。


上代码

#include <stdio.h>int main(void)
{int i;int tmp = 0;for (i=1; i<5; i++) {tmp++;printf("tmp = %d\n", tmp);printf("&i = %d\n\n", &i);}return 0;
}
/*
运行结果:
tmp = 1
&i = 6422296tmp = 2
&i = 6422296tmp = 3
&i = 6422296tmp = 4
&i = 6422296
*/

改代码

#include <stdio.h>int main(void)
{/* 加上register关键字 */register int i;int tmp = 0;for (i=1; i<5; i++) {tmp++;printf("tmp = %d\n", tmp);printf("&i = %d\n\n", &i);}return 0;
}
/*
运行结果:
045.c: In function 'main':
045.c:16:3: error: address of register variable 'i' requested16 |   printf("&i = %d\n\n", &i);
*/

错误分析:

原因:address of register variable ‘i’ requested


问题

为什么register修饰的变量不能取地址呢?

学习

  1. register关键字的作用

    首先,register关键字会:
    “advises the compiler that the variable in questions will be heavily used”

    如果advise成功,则:
    “register variables are to be replaced in machine registers, which may result in smaller and faster programers”

    但是呢, “compilers are free to ignore the advise”


从上述内容中可知,register关键字也只能向编译器“提建议”,建议把它修饰的变量放入寄存器,但是否放入寄存器最终还是编译器说了算。


当然,“言论自由不代表可以散布谣言、扰乱社会治安”,所以: “the register declaration can only be applied to automatic variables and to formal parameters of a function”


那么,为什么register会有这么多限制呢?只能提建议,还要按规定提建议。 限制来源于“物理寄存器“本身的特点。


寄存器在cpu内部,特殊的位置使它存取数据速度最快,但是数量也最少。所以一定要省着点用,要注意及时回收。


程序员根本不知道程序运行的时候,cpu中有多少寄存器可以使用,所以是否放入寄存器还得编译器说的靠谱。 另外,寄存器这么珍贵的资源,当然不能被某些变量一直占着不释放,所以register只能用来修饰自动变量和形参这些一旦所在的子函数运行结束立即释放、占用寄存器周期短的变量。全局变量得等到整个程序运行结束才释放,若放入寄存器,就很可能造成寄存器使用完毕的情况,寄存器使用完,cpu就瘫痪了。


  1. &符号的用法
    the & operator only applies to objects in memory: variables and array elements”

看到这,也许有人觉得,取地址符号&只能应用于内存,register变量在寄存器中,当然不能对register变量取地址了。

别忘了,register只是建议,有的register修饰的变量被编译器放入了内存,那这个时候能不能取地址呢?

答案:规定了,不能。“it is not possible to take the address of a register variable, regardless of whether the variable is actually placed in a register”


大总结

  1. register修饰的变量由编译器决定是否放入寄存器
  2. 取地址符号只能应用于内存,求取内存中的地址,不能取寄存器的地址
  3. 就算register修饰的变量被编译器放到了内存,规定也不能使用取地址符号&求其地址,否则编译报错。




阅读摘抄分享:

木桶定律:

  1. 阿喀琉斯之踵,再刀枪不入与百毒不侵,也有最薄弱之处。
  2. 遇到问题,不要蛮干,找到导致问题的“短板”,科学予以解决,从而达到事半功倍的效果。

register关键字的使用相关推荐

  1. C++对C的加强之register关键字增强

    register关键字增强 前言 register关键字的变化 前言 //register关键字 请求编译器让变量a直接放在寄存器里面,速度快 //在c语言中 register修饰的变量 不能取地址, ...

  2. C语言register关键字——最快的关键字

    C语言register关键字-最快的关键字 (2012-08-24 14:09:24) 转载▼ 标签: 杂谈 分类: C/C    register:这个关键字请求编译器尽可能的将变量存在CPU内部寄 ...

  3. register关键字

    文章目录 1 register关键字 2 C++中的register关键字 1 register关键字 对于register关键字: register关键字只能作用于局部变量,不能作用于全局变量. r ...

  4. C语言register关键字—最快的关键字

    register:这个关键字请求编译器尽可能的将变量存在CPU内部寄存器中,而不是通过内存寻址访问,以提高效率.注意是尽可能,不是绝对.你想想,一个CPU 的寄存器也就那么几个或几十个,你要是定义了很 ...

  5. 【C++】register 关键字

    文章目录 一. 什么是寄存器? 二. 为什么要存在寄存器? 三. register 修饰变量 一. 什么是寄存器? 我们都知道,CPU主要是负责进行计算的硬件单,但是为了方便运算,一般第一步需要先把数 ...

  6. C和指针之auto和内存栈和register关键字

    1.auto 在C代码中每个函数都有其生命周期(也称作用域),在函数生命周期中声明的变量通常叫做局部变量,也叫自动变量.例如: 复制代码代码如下: int chenyu(){ int a = 10; ...

  7. register关键字-1

    #include<iostream>using namespace std;int main(int argc, char*argv[]) /* Rong Tao 2018.03.19 * ...

  8. C++ register 关键字

    register 简介: register 就像是汉语和英语中的形容词(不要问为什么只有两种语言,因为小编只会这两种),在 C++ 中 register 是用来修饰变量的. register 的作用: ...

  9. 详细说明register关键字

    一 register的作用(加上volatile都是让其变成易变的,防止编译器对其进行优化) 一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了. ...

最新文章

  1. 第6周小组作业:软件测试和评估
  2. 6-4 链表拼接 (20分)_青岛喷绘制作公司不愿透露的喷绘布拼接与安装技巧,建议收藏...
  3. java常见面试题总结
  4. Hbuilder开发HTML5 APP之打开新页面
  5. hcg值小于0.1_电容的Q值
  6. LeetCode-剑指 Offer 18. 删除链表的节点
  7. JZOJ 1980. 【2011集训队出题】Construct
  8. Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行——怎么将Unix/Mac系统下的文件转换到Windows系统下
  9. 柠檬视频php源码,最新柠檬视频完整开源版源码分享,自适应WAP手机端,含APP源代码,详细的安装教程等等...
  10. python 实现相关系数计算和检验
  11. HDU 4173(计算几何
  12. iOS SceneDelegate使用总结
  13. AtCoder Beginner Contest 043题解(ABCD)
  14. 计算机科学与技术专业毕业答辨问题,计算机科学与技术论文答辩问题(问题及技巧介绍)...
  15. 【优化理论与方法】线性规划的基本定理
  16. 什么是最长前缀匹配?为什么网络前缀越长,其地址块就越小,路由就越具体?
  17. C#实现PDF转PNG图片
  18. 对Livox_avia内置IMU-BMI088进行内参标定
  19. python 查找损坏图片_使用Python查找损坏的图像
  20. 上海市高等学校计算机vb,上海市高等学校计算机等级考试vb考纲.doc

热门文章

  1. vcruntime140_1.dll无法继续执行代码,vcruntime140_1.dll丢失修复方法
  2. 区块链学习路径,看这一篇就够了 | FISCO BCOS
  3. Spring AOP中的静态代理和动态代理的原理和实践
  4. vue3.0 透传 Attribute
  5. 【236】Python求列表最长字符串及lambda和最长公共子串
  6. PTA Easy chemistry 化学方程式等价判定 string 状态机
  7. ROS基础学习之ros-tutorials(一)
  8. ping一个地址回显无法访问目的主机,然后显示请求超时time out问题分析
  9. CSDN Markdown 显示连续两个中划线 --
  10. DoNet学习-WebForm视频教程(30集)