【转载】register、volatile、restrict 三关键字的用法
原文地址: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 三关键字的用法相关推荐
- 内联函数 —— C 中关键字 inline 用法解析(转载)
一.什么是内联函数 在C语言中,如果一些函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗. 为了解决这个问题,特别的引入了inline修饰符,表示为内联函数. 栈空间就是指放 ...
- vu16和u16的区别 volatile关键字的用法简介
通过查看头文件中是否有预定义 #define __IO volatile /*!< defines 'read / write' permissi ...
- C# 关键字extern用法
C# 关键字extern用法 修饰符用于声明在外部实现的方法.extern 修饰符的常见用法是在使用 Interop 服务调入非 托管代码时与 DllImport 属性一起使用:在这种情况下,该方法还 ...
- static关键字的用法与作用
在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构.下面我们先来了解一下stat ...
- .Net 基础new关键字的用法
一.new的基本功能 一般说来,new关键字在.net中用于以下四个场合. 作为运算符,用于创建对象和调用构造函数,范围用得最多吧. 实现多态. 作为修饰符,用于向基类成员隐藏继承类成员,一般继承情况 ...
- java编程里的values怎么使用,详解Java编程中super关键字的用法
这篇文章主要介绍了Java编程中this与super关键字的用法,包括从内存结构方面分析super的作用域,需要的朋友可以参考下 通过用static来定义方法或成员,为我们编程提供了某种便利,从某种程 ...
- __declspec关键字详细用法
__declspec关键字详细用法 2009-01-21 16:23 __declspec用于指定所给定类型的实例的与Microsoft相关的存储方式.其它的有关存储方式的修饰符如static与ext ...
- Java this 关键字的用法
this 关键字的用法 this 在类中就是代表当前对象,可以通过 this 关键字完成当前 对象的成员属性.成员方法和构造方法的调用. 那么何时用 this? 当在定义类中的方法时,如果需要调用该类 ...
- C++中virtual关键字的用法
关于virtual关键字的用法总结如下,有错误或者总结不到位的情况请能帮本人指出,非常感谢! Virtual是C++ OO机制中很重要的一个关键字.只要是学过C++的人都知道在类Base中加了Virt ...
最新文章
- android开发基础_列表视图一(List View)
- 正则表达式。部分实例及说明(摘)
- 1.3 安装Oracle遇到的问题-yum更新配置
- 我的技术回顾那些与ABP框架有关的故事-2018年
- jdk 1.8 字符串+_JDK 9/10/11:Java字符串上+ =的副作用
- arcgis vue 添加图层优化_行业 | ArcGIS制图技巧(超全)
- 信息学奥赛一本通 1141:删除单词后缀 | OpenJudge NOI 1.7 20
- mysql是什么1001mysql是什么_mysql深入理解
- 深度学习-Tensorflow1.x-CNN中的padding参数
- 极简风格的响应式简历模板
- RocketMQ源码解析-PushConsumer(2)
- fragment的懒加载
- 单片机c语言按照长度分割字符串,单片机c语言字符串操作
- python期末考试及答案广东_PYTHON语言应用答案试题题目及答案,期末考试题库,章节测验答案...
- Deecamp20 项目提交【如何用pcdet(second)跑自己的数据】
- 各种语言如何连接到 OceanBase
- AT指令对wavecom串口GSM工业手机发送短信(英文和PDU短信)
- 使用Android Studio 查看内存泄漏
- MIRACL密码库分析报告3 mrio.c
- unity3D第一人称射击游戏(推荐)
热门文章
- python【蓝桥杯vip练习题库】BASIC-9特殊回文数
- C++ with STL(五)queuestacklist
- 免费网络推广浅析对网站首页优化的注意细节把控!
- 网络推广是做什么的知道网站做301定向跳转对优化有什么帮助?
- 如何拓展外链引流,让网站成为“顶牛”?
- 如何快速增加网站收录?
- layui table行点击tr_layui框架table表格实现单击行选中checkbox功能
- bilibili怎么设置弹幕数量_python爬取B站视频弹幕分析并制作词云
- 开发日记-20190914 关键词 汇编语言王爽版 第七章第八章
- python pipe stdout 实现cat|grep 功能