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 关键字相关推荐

  1. 通过反汇编来理解restrict关键字

    一次难忘的面试经历 多年前,一次互联网某厂实习生的面试题,题目的代码片段很简单,如下: 1 #include 2 int main()3 {4 int *restrict pInt = (int*)m ...

  2. C语言中restrict的意义,restrict关键字在C ++中的含义是什么?

    正如其他人所说,如果C ++ 14中没有任何意义,那么让我们考虑一下__restrict__与C99相同的GCC扩展restrict. C99 restrict说两个指针不能指向重叠的内存区域.最常见 ...

  3. [C/C++学习] restrict 关键字

    本篇博客主要谈论 C 语言关键字 restrict,只用于修饰指针,功能是帮助编译器进行优化!值得注意的是,优化需要就事论事,经过分析:如果发现确实优化不了,就不优化了.不加 restrict 关键字 ...

  4. C99中的restrict关键字

    今天读APUE,看到某个函数原型的声明:      int  stat (   const   char   *  restrict  pathname, struct  stat  *  restr ...

  5. C语言中restrict关键字学习

    简介: restrict是c99标准引入的,它只可以用于限定和约束指针,并表明指针是访问一个数据对象的唯一且初始的方式.即它告诉编译器,所有修改该指针所指向内存中内容的操作都必须通过该指针来修改,而不 ...

  6. restrict关键字用法

    c99中新增加了一个类型定义,就是restrict. 概括的说,关键字restrict只用于限定指针:该关键字用于告知编译器,所有修改该指针所指向内容的操作全部都是基于(base on)该指针的,即不 ...

  7. C/C++中的restrict关键字

    restrict用于限定和约束指针,表示这个指针只访问这块内存的唯一方式,也就是告诉编译器,这块内存中的内容的操作都只会通过这个指针,而不会通过其他变量或者指针.这个指针有两个作用,一个是告诉编译器, ...

  8. restrict关键字

    c99中新增加了一个类型定义,就是restrict 看了下网上的相关贴子,但还是问题解决的不够.下面是相关一个文章,我将在后面再加相关说明: 那么restrict的意义是什么呢? 概括的说,关键字re ...

  9. C语言的关键字restrict,C语言中restrict关键字学习

    简介:程序员 restrict是c99标准引入的,它只能够用于限定和约束指针,并代表指针是访问一个数据对象的惟一且初始的方式.即它告诉编译器,全部修改该指针所指向内存中内容的操做都必须经过该指针来修改 ...

  10. C语言的 restrict 关键字的作用

    restrict 这个关键字到底有什么用,还是用代码看得清楚.这里,c 标准说明中用了如下的例子: #include <stdio.h>int foo(int *a, int *b) {* ...

最新文章

  1. 第四十四节,subprocess系统命令模块
  2. 涨姿势:另类的表情域名赚钱大法!!
  3. 数据结构+算法——错题总结
  4. Highcharts 散点图介绍
  5. android摄像头矩形框提取_视频图像摄像头跟踪的上位机系统设计
  6. 修改wap游戏服务器,修改wap游戏服务器
  7. (转)Locale 详解
  8. IBM宣布:成功研制出了量子计算机原型机,量子计算机商业化正在加速!
  9. Telnet Sequence Diagram
  10. (一)hadoop 权威指南---气象数据获取
  11. TL431中文资料特性及应用
  12. 无标度网络的C++代码实现
  13. java餐饮系统需求总结,基于java的餐饮管理系统的设计与实现开题报告
  14. 如何将PPT中的图片无改变矢量图插入word中以及matlab矢量图插入word方法【每天一个小技巧】
  15. H264 码率控制原理
  16. Windbg命令学习4(d和e)
  17. 大数据分析原地踏步 原来是分析工具面临信任问题
  18. 第6章 查询处理和查询优化
  19. 中国知网论文查重算法和修改攻略
  20. 软件开发英语面试自我介绍及问答

热门文章

  1. ie对象不支持“jggrid“属性或方法_8.2 location 对象
  2. vivado中交织模块_Adalm Pluto SDR主动学习模块让您拥有完善的无线电RF射频实验室...
  3. csv文件的读写-列表,字典方式
  4. docker镜像图[更新中]
  5. java改变人物动作_Java创建对象的动作分析
  6. opengl 保留上一帧_历史上第一部长片动画,还真有点重口
  7. thinkphp5---join联合查询
  8. 打造可降级的React服务端同构框架
  9. 一种低侵入性的组件化方案 之 组件化需要考虑的几个问题
  10. Boot2Docker 安装运行出现客户端与服务端版本不一致的解决办法