restrict

允许编译器优化某部分代码以更好地支持计算,它只能用于指针,表明该指针是访问数据对象的唯一且初始的方式。
用于告诉编译器,对象已经被指针所引用,不能通过除该指针外所有其他直接或间接的方式修改该对象的内容。

#include<stdio.h>
int main()
{int arr[10];int *restrict restar=(int *)malloc(10*sizeof(int));int *par=ar;for(int n=0;n<10;n++){par[n]+=5;restar[n]+=5;arr[n]*=2;par[n]+=3;restar[n]+=3;  }
}

因为restar是访问它所指向的数据块的唯一且初始的方式,编译器可以把涉及restart的两条语句替换成下面这条语句,效果相同 
                restar[n]+=8;
但是把与par相关的两条语句替换成下面的语句,将导致计算错误
                par[n]+=8;
因为for循环在par两次访问相同的数据之间,用ar改变了该数据的值.在该例中,如果使用了 restrict 关键字,编译器就可以选择捷径优化计算

restrict还可用于函数形参中的指针,这意味着编译器可以假定在函数体内其他
标识符不会修改该指针指向的数据,而且编译器可以尝试对其优化,使其不做别的用途

volatile 类型限定符

告知计算机,代理可以改变该变量的值,通常,它被用于硬件地址及 在其他程序或同时运行的线程中共享数据,例如,一个地址上可能存储着当前的时钟时间,无论程序做什么,地址上的值都随着时间的变化而改变,或者一个地址用于接受另一台计算机传入的信息.简单地说就是防止编译器对代码进行优化。 确保本条指令不会因编译器的优化而省略,且要求每次直接读值.精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。

volatile int locl;    //易变型变量,locl 是一个易变的位置说明这变量可能会被意想不到的改变,这样,编译器就不会假设这个变量的值了
volatile int *ploc;     //指向易变型变量的指针,val1=x;
val2=x;
智能的(进行优化的)编译器会注意到以上代码使用了两次x,但并未改变它的值,于是编译器
把x的值临时存储在寄存器中,然后在val2需要使用x时,才从寄存器中(而不是从原始内存位置
上)读取x的值,以节约时间,这个过程被称为高速缓存。但是如果一些其他代理在以上两句语句之间改变了x的值,就不能这样优化了,如果没有
volatile 关键字,编译器就不会知道这种事情是否会发生。而现在,如果未使用volatile 关键字,编译
器会假定变量的值在使用过程中不变,然后尝试优化 volatile const int loc;      //程序不能改变的变量,但是可以通过代理改变
const volatile int *ploc; 

restrict和volatile相关推荐

  1. 自己写编译器学习总结

    如何写一个简单的编译器? https://www.zhihu.com/question/36756224 初学编译原理,想写一个简单的编译器. 是时候亮出我的 LL 语言了,全称:Lambda Lit ...

  2. devc 无法编译循环语句_鸡生蛋还是蛋生鸡?详解第一个编译器是怎么来的~

    详解编译器自举原理 不知道你有没有想过,某种编程语言的第一个编译器是怎么来的呢?这不就是"鸡生蛋,蛋生鸡"的问题吗? 先说最后的结论:任何一种语言的第一个编译器肯定是使用其他语言写 ...

  3. 48岁的C语言,你知道它背后的历史吗?

    C语言作为一个人尽皆知的语言,甚至没有学过编程语言的人也知道它的大名.经历沧桑岁月的它,已经陪伴我们走过了48个年头.回望当年,C语言还在襁褓之中-- 贝尔实验室特别人员奖.美国计算机协会(ACM)的 ...

  4. 【C语言】中的版本规范(C89 C99等)

    C语言中的版本 一.相关基础知识 ISO:国际标准化组织(International Organization for Standardization,ISO)简称ISO,是一个全球性的非政府组织,是 ...

  5. 深度 || 既然C编译器是C语言写的,那么第一个C编译器是怎样来的?

    来源:伯乐在线,作者:Chaobs 首先向C语言之父Dennis Ritchie致敬! 当今几乎所有的实用的编译器/解释器(以下统称编译器)都是用C语言编写的,有一些语言比如Clojure,Jytho ...

  6. C++ 学习(基础语法篇)

    一.基础语法 1.1 C++ 简介 C++ 是一种静态类型的.编译式的.通用的.大小写敏感的.不规则的编程语言,支持过程化编程.面向对象编程和泛型编程. C++ 是 C 的一个超集,事实上,任何合法的 ...

  7. c语言的应用与作用,C语言主要应用在什么地方?

    C语言是一种计算机程序设计语言.它既有高级语言的特点,又具有汇编语言的特点.它可以作为系统设计语言,编写工作系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序.因此,它的应用范围 ...

  8. c99标准--C语言标准

    转自:http://baike.baidu.com/view/1967819.htm?fr=ala0_1 c99 c99是在c89的基础上发展起来的,增加了基本数据类型,关键字和一些系统函数等.其实在 ...

  9. C语言 1999年标准

    (C99)1999年 ANSI对C语言作了很大的改变. 在ANSI标准化后,C语言的标准在一段相当的时间内都保持不变,尽管C 继续在改进.(实际上,Normative Amendment1在1995年 ...

最新文章

  1. hdu-6166(最短路+二进制分组)
  2. 深刻好文|关于资产与负债的思考(国庆活动开启)
  3. sas university edition在ubuntu中的使用
  4. python docker_Docker实践:python应用容器化
  5. linux mint 1.9 qq 安装
  6. 利用计算机系统辅助设计人员,计算机基础知识:计算机辅助设计
  7. Openwrt 路由器挂载摄像头教程
  8. NVIDIA-cuda-cudnn下载地址
  9. html5脑图_使用HTML5技术绘制思维导图
  10. windows搭建frp服务器_Windows平台下FRP内网穿透的搭建
  11. Python---format格式化
  12. 附近商家位置java开发附近定位
  13. (4)tiny4412移植uboot_2018_07
  14. java毕业设计校园新闻网站mybatis+源码+调试部署+系统+数据库+lw
  15. 智能360度业务数据管理, 新视角重塑新体验!
  16. 苹果手机充电孔变松了_不久的将来,甚至下一代的苹果手机会取消充电接口吗?...
  17. Html实现立体相册
  18. Permissions 0664 for 'mykeypair.pem' are too open.
  19. win7需要计算机管理员权限,Win7系统提示“需要管理员权限”该如何解决?
  20. 价格逗号怎么打_OFFICE软件之间的协作技巧,打通任督二脉,提升办公效率!

热门文章

  1. Iterm2 设置快捷键 Home End 行首 行尾 上个单词 下个单词
  2. 小程序输入框完成切换到下个输入框
  3. ElasticSearch学习_陶文2_时间序列数据库的秘密(2)——索引
  4. SpringBoot | 第零章:前言
  5. Android面试题之重男轻女until男的男女概率
  6. lua语言入门学习(一)搭建基本的环境并实现运行
  7. 2017计算机家庭拥有量,中国数字鸿沟报告.doc
  8. 【CC2530入门教程-04】CC2530的定时/计数器原理与应用
  9. 人生不应该是“一个几十年“,而应该是”几个一十年“。
  10. 【机器视觉案例】(15) 虚拟答题板,手部关键点识别,附python完整代码