原文地址:register、volatile、restrict 三关键字的用法 – RaymondAmos的技术专栏 – CSDN博客.

register

使用修饰符register声明的变量属于寄存器存储类型。该类型与自动存储类型相似,具有自动存储时期、代码块作用域和内连接。声明为register 仅仅是一个请求,因此该变量仍然可能是普通的自动变量。无论哪种情况,用register修饰的变量都无法获取地址。如果没有被初始化,它的值是未定的。

volatile
volatile告诉编译器该被变量除了可被程序修改外,还可能被其他代理、线程修改。因此,当使用volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,而不使用寄存器中的缓存的值。比如,

val1=x;
val2=x;

如 果没有声明volatile,系统在给val2赋值的时候可能直接从寄存器读取x,而不是从内存的初始位置读取。那么在两次赋值之间,x完全有可能被被某 些编译器未知的因素更改(比如:操作系统、硬件或者其它线程等)。如果声明为volatile,编译器将不使用缓存,而是每次都从内存重新读取x。
restrict

restrict是c99引入的,它只可以用于限定指针,并表明指针是访问一个数据对象的唯一且初始的方式,考虑下面的例子:

int ar[10];
int * restrict restar=(int *)malloc(10*sizeof(int));
int *par=ar;

这里说明restar是访问由malloc()分配的内存的唯一且初始的方式。par就不是了。那么:

for(n=0;n<10;n++)
{par[n]+=5;restar[n]+=5;ar[n]*=2;par[n]+=3;restar[n]+=3;
}

因 为restar是访问分配的内存的唯一且初始的方式,那么编译器可以将上述对restar的操作进行优化:restar[n]+=8;。而par并不是访 问数组ar的唯一方式,因此并不能进行下面的优化:par[n]+=8;。因为在par[n]+=3前,ar[n]*=2进行了改变。使用了关键字 restric,编译器就可以放心地进行优化了。这个关键字据说来源于古老的FORTRAN。

总结

两个关键字:volatile和restrict,两者都是为了方便编译器的优化。

转载于:https://www.cnblogs.com/lovemdx/archive/2012/11/14/2769436.html

【转载】register、volatile、restrict 三关键字的用法相关推荐

  1. 内联函数 —— C 中关键字 inline 用法解析(转载)

    一.什么是内联函数 在C语言中,如果一些函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗. 为了解决这个问题,特别的引入了inline修饰符,表示为内联函数. 栈空间就是指放 ...

  2. vu16和u16的区别 volatile关键字的用法简介

    通过查看头文件中是否有预定义 #define     __IO    volatile                  /*!< defines 'read / write' permissi ...

  3. C# 关键字extern用法

    C# 关键字extern用法 修饰符用于声明在外部实现的方法.extern 修饰符的常见用法是在使用 Interop 服务调入非 托管代码时与 DllImport 属性一起使用:在这种情况下,该方法还 ...

  4. static关键字的用法与作用

    在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构.下面我们先来了解一下stat ...

  5. .Net 基础new关键字的用法

    一.new的基本功能 一般说来,new关键字在.net中用于以下四个场合. 作为运算符,用于创建对象和调用构造函数,范围用得最多吧. 实现多态. 作为修饰符,用于向基类成员隐藏继承类成员,一般继承情况 ...

  6. java编程里的values怎么使用,详解Java编程中super关键字的用法

    这篇文章主要介绍了Java编程中this与super关键字的用法,包括从内存结构方面分析super的作用域,需要的朋友可以参考下 通过用static来定义方法或成员,为我们编程提供了某种便利,从某种程 ...

  7. __declspec关键字详细用法

    __declspec关键字详细用法 2009-01-21 16:23 __declspec用于指定所给定类型的实例的与Microsoft相关的存储方式.其它的有关存储方式的修饰符如static与ext ...

  8. Java this 关键字的用法

    this 关键字的用法 this 在类中就是代表当前对象,可以通过 this 关键字完成当前 对象的成员属性.成员方法和构造方法的调用. 那么何时用 this? 当在定义类中的方法时,如果需要调用该类 ...

  9. C++中virtual关键字的用法

    关于virtual关键字的用法总结如下,有错误或者总结不到位的情况请能帮本人指出,非常感谢! Virtual是C++ OO机制中很重要的一个关键字.只要是学过C++的人都知道在类Base中加了Virt ...

最新文章

  1. android开发基础_列表视图一(List View)
  2. 正则表达式。部分实例及说明(摘)
  3. 1.3 安装Oracle遇到的问题-yum更新配置
  4. 我的技术回顾那些与ABP框架有关的故事-2018年
  5. jdk 1.8 字符串+_JDK 9/10/11:Java字符串上+ =的副作用
  6. arcgis vue 添加图层优化_行业 | ArcGIS制图技巧(超全)
  7. 信息学奥赛一本通 1141:删除单词后缀 | OpenJudge NOI 1.7 20
  8. mysql是什么1001mysql是什么_mysql深入理解
  9. 深度学习-Tensorflow1.x-CNN中的padding参数
  10. 极简风格的响应式简历模板
  11. RocketMQ源码解析-PushConsumer(2)
  12. fragment的懒加载
  13. 单片机c语言按照长度分割字符串,单片机c语言字符串操作
  14. python期末考试及答案广东_PYTHON语言应用答案试题题目及答案,期末考试题库,章节测验答案...
  15. Deecamp20 项目提交【如何用pcdet(second)跑自己的数据】
  16. 各种语言如何连接到 OceanBase
  17. AT指令对wavecom串口GSM工业手机发送短信(英文和PDU短信)
  18. 使用Android Studio 查看内存泄漏
  19. MIRACL密码库分析报告3 mrio.c
  20. unity3D第一人称射击游戏(推荐)

热门文章

  1. python【蓝桥杯vip练习题库】BASIC-9特殊回文数
  2. C++ with STL(五)queuestacklist
  3. 免费网络推广浅析对网站首页优化的注意细节把控!
  4. 网络推广是做什么的知道网站做301定向跳转对优化有什么帮助?
  5. 如何拓展外链引流,让网站成为“顶牛”?
  6. 如何快速增加网站收录?
  7. layui table行点击tr_layui框架table表格实现单击行选中checkbox功能
  8. bilibili怎么设置弹幕数量_python爬取B站视频弹幕分析并制作词云
  9. 开发日记-20190914 关键词 汇编语言王爽版 第七章第八章
  10. python pipe stdout 实现cat|grep 功能