【C】C99 restrict 关键字
restrict是C99引入的关键字,该关键字适用于指针的声明,并表明指针是访问一个数据对象的唯一且初始的方式,由此编译器可以进行一些优化。
例1
搞自:http://www.blogjava.net/killme2008/archive/2007/08/04/134399.html
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,编译器就可以放心地进行优化了。
例2
参考:http://en.wikipedia.org/wiki/Restrict
考虑下面两个函数: test.c
void fun1(size_t *pa, size_t *pb, size_t *pc) {*pc += *pa;*pb += *pa; }void fun2(size_t *restrict pa, size_t *restrict pb, size_t *restrict pc) {*pc += *pa;*pb += *pa; }
gcc -S -std=c99 -O2 test.c 查看其汇编源码,经分析可以发现fun2比fun1少执行一条汇编语句,从而实现优化。
fun1:pushl %ebpmovl %esp, %ebpmovl 8(%ebp), %edxmovl 16(%ebp), %ecxmovl 12(%ebp), %eaxpushl %ebx movl (%edx), %ebx ;此时edx保存的是pa的值,此句执行结果是把pa指针指向的值存放在ebx中 addl %ebx, (%ecx) ;ecx保存的是pc的值,把ebx的值加到pc指向的地址中 movl (%edx), %edx ;把pa解引用后的值保存在edx中 addl %edx, (%eax) ;eax保存的是pb的值,把edx的值加到pb指向的地址中 ;; 如果我们可以确保ebx的值没有发生改变,我们完全可以省去movl (%edx), %edx,并修改addl %edx, (%eax)为addl %ebx, (%eax),从而提高效率。 ;; 但编译器没有这么做,因为有可能pa和pc指向同一块内存区域,修改pc的值有可能修改pa的值,所以要必须重新载入pa指向的值 popl %ebxpopl %ebpret.size fun1, .-fun1.p2align 4,,15 .globl fun2.type fun2, @function fun2:pushl %ebpmovl %esp, %ebpmovl 8(%ebp), %edxmovl 16(%ebp), %ecxmovl 12(%ebp), %eaxmovl (%edx), %edxaddl %edx, (%ecx)addl %edx, (%eax);; 使用restrict关键字后,编译器就知道pa,pb,pc指向不同的内存区域(至于是否真正指向不同的区域需要程序员来保证),修改pc的值不会影响pa的值,所以edx的值没有改变,还可以继续使用,从而减少一条汇编语句 popl %ebpret.size fun2, .-fun2.p2align 4,,15
转载于:https://www.cnblogs.com/visayafan/archive/2012/06/01/2529426.html
【C】C99 restrict 关键字相关推荐
- 通过反汇编来理解restrict关键字
一次难忘的面试经历 多年前,一次互联网某厂实习生的面试题,题目的代码片段很简单,如下: 1 #include 2 int main()3 {4 int *restrict pInt = (int*)m ...
- C语言中restrict的意义,restrict关键字在C ++中的含义是什么?
正如其他人所说,如果C ++ 14中没有任何意义,那么让我们考虑一下__restrict__与C99相同的GCC扩展restrict. C99 restrict说两个指针不能指向重叠的内存区域.最常见 ...
- [C/C++学习] restrict 关键字
本篇博客主要谈论 C 语言关键字 restrict,只用于修饰指针,功能是帮助编译器进行优化!值得注意的是,优化需要就事论事,经过分析:如果发现确实优化不了,就不优化了.不加 restrict 关键字 ...
- C99中的restrict关键字
今天读APUE,看到某个函数原型的声明: int stat ( const char * restrict pathname, struct stat * restr ...
- C语言中restrict关键字学习
简介: restrict是c99标准引入的,它只可以用于限定和约束指针,并表明指针是访问一个数据对象的唯一且初始的方式.即它告诉编译器,所有修改该指针所指向内存中内容的操作都必须通过该指针来修改,而不 ...
- restrict关键字用法
c99中新增加了一个类型定义,就是restrict. 概括的说,关键字restrict只用于限定指针:该关键字用于告知编译器,所有修改该指针所指向内容的操作全部都是基于(base on)该指针的,即不 ...
- C/C++中的restrict关键字
restrict用于限定和约束指针,表示这个指针只访问这块内存的唯一方式,也就是告诉编译器,这块内存中的内容的操作都只会通过这个指针,而不会通过其他变量或者指针.这个指针有两个作用,一个是告诉编译器, ...
- restrict关键字
c99中新增加了一个类型定义,就是restrict 看了下网上的相关贴子,但还是问题解决的不够.下面是相关一个文章,我将在后面再加相关说明: 那么restrict的意义是什么呢? 概括的说,关键字re ...
- C语言的关键字restrict,C语言中restrict关键字学习
简介:程序员 restrict是c99标准引入的,它只能够用于限定和约束指针,并代表指针是访问一个数据对象的惟一且初始的方式.即它告诉编译器,全部修改该指针所指向内存中内容的操做都必须经过该指针来修改 ...
- C语言的 restrict 关键字的作用
restrict 这个关键字到底有什么用,还是用代码看得清楚.这里,c 标准说明中用了如下的例子: #include <stdio.h>int foo(int *a, int *b) {* ...
最新文章
- 第四十四节,subprocess系统命令模块
- 涨姿势:另类的表情域名赚钱大法!!
- 数据结构+算法——错题总结
- Highcharts 散点图介绍
- android摄像头矩形框提取_视频图像摄像头跟踪的上位机系统设计
- 修改wap游戏服务器,修改wap游戏服务器
- (转)Locale 详解
- IBM宣布:成功研制出了量子计算机原型机,量子计算机商业化正在加速!
- Telnet Sequence Diagram
- (一)hadoop 权威指南---气象数据获取
- TL431中文资料特性及应用
- 无标度网络的C++代码实现
- java餐饮系统需求总结,基于java的餐饮管理系统的设计与实现开题报告
- 如何将PPT中的图片无改变矢量图插入word中以及matlab矢量图插入word方法【每天一个小技巧】
- H264 码率控制原理
- Windbg命令学习4(d和e)
- 大数据分析原地踏步 原来是分析工具面临信任问题
- 第6章 查询处理和查询优化
- 中国知网论文查重算法和修改攻略
- 软件开发英语面试自我介绍及问答
热门文章
- ie对象不支持“jggrid“属性或方法_8.2 location 对象
- vivado中交织模块_Adalm Pluto SDR主动学习模块让您拥有完善的无线电RF射频实验室...
- csv文件的读写-列表,字典方式
- docker镜像图[更新中]
- java改变人物动作_Java创建对象的动作分析
- opengl 保留上一帧_历史上第一部长片动画,还真有点重口
- thinkphp5---join联合查询
- 打造可降级的React服务端同构框架
- 一种低侵入性的组件化方案 之 组件化需要考虑的几个问题
- Boot2Docker 安装运行出现客户端与服务端版本不一致的解决办法