简介:程序员

restrict是c99标准引入的,它只能够用于限定和约束指针,并代表指针是访问一个数据对象的惟一且初始的方式.即它告诉编译器,全部修改该指针所指向内存中内容的操做都必须经过该指针来修改,而不能经过其它途径(其它变量或指针)来修改;这样作的好处是,能帮助编译器进行更好的优化代码,生成更有效率的汇编代码.如 int *restrict ptr, ptr 指向的内存单元只能被 ptr 访问到,任何一样指向这个内存单元的其余指针都是未定义的,直白点就是无效指针。restrict 的出现是由于 C 语言自己固有的缺陷,C 程序员应当主动地规避这个缺陷,而编译器也会很配合地优化你的代码.数组

考虑下面的例子:函数

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;spa

由于在par[n]+=3前,ar[n]*=2进行了改变。使用了

关键字

restrict,编译器就能够放心地进行优化了。

这个关键字听说来源于古老的FORTRAN。有兴趣的看看这个。

C库中有两个函数能够从一个位置把字节复制到另外一个位置。在C99标准下,它们的原型以下:.net

void * memcpy(void * restrict s1, const void * restrict s2, size_t n);

void * memove(void * s1, const void * s2, size_t n);

这两个函数均从s2指向的位置复制n字节数据到s1指向的位置,且均返回s1的值。二者之间的差异由关键字restrict形成,即memcpy()能够假定两个内存区域没有重叠。memmove()函数则不作这个假定,所以,复制过程相似于首先将全部字节复制到一个临时缓冲区,而后再复制到最终目的地。若是两个区域存在重叠时使用memcpy()会怎样?其行为是不可预知的,既能够正常工做,也可能失败。在不该该使用memcpy()时,编译器不会禁止使用memcpy()。所以,使用memcpy()时,您必须确保没有重叠区域。这是程序员的任务的一部分。

关键字restrict有两个读者。一个是编译器,它告诉编译器能够自由地作一些有关优化的假定。另外一个读者是用户,他告诉用户仅使用知足restrict要求的参数。通常,编译器没法检查您是否遵循了这一限制,若是您蔑视它也就是在让本身冒险。

原文:http://blog.csdn.net/llf021421/article/details/8092602指针

书本C Primer Plus第12章 12.7.3 类型限定词restrictrest

C语言的关键字restrict,C语言中restrict关键字学习相关推荐

  1. c语言typeof 变量,c语言中typeof关键字

    为什么因为一个关键字而专门写一篇随笔呢?因为这个关键字在Linux里面地位非同一般!这个关键字typeof在linux内核里面使用非常广泛! 下面这两个等效声明,用于声明int类弄的变量a typeo ...

  2. C语言中定义常量的关键字是什么,C++_详解C语言中const关键字的用法,关键字const用来定义常量,如 - phpStudy...

    详解C语言中const关键字的用法 关键字const用来定义常量,如果一个变量被const修饰,那么它的值就不能再被改变,我想一定有人有这样的疑问,C语言中不是有#define吗,干嘛还要用const ...

  3. c语言关键字extern作用,C语言中extern关键字详解

    <C语言中extern关键字详解>由会员分享,可在线阅读,更多相关<C语言中extern关键字详解(5页珍藏版)>请在人人文库网上搜索. 1.C 语言中 extern 关键字详 ...

  4. C语言中static关键字详解

    C语言中staic关键字很简单,简单到你的任何一个项目中可以不写一个staic关键字也是没有问题的.写这篇章主要是一下自己的staic的理解和应用,当然在章开头依旧要照本宣科简述一下static关键字 ...

  5. c语言用string类型,c语言中的string

    1. strlen(char const* s); 函数传入的是c风格字符串(即以'\0'结尾的字符数组),返回的长度为size_t(即unsigned int),其长度不包括'\0'. 2. str ...

  6. c语言typedef的用法,C语言中typedef用法总结,看完就能像编程老手一样熟练运用...

    请看下文 C语言中typedef关键字应用比较常见,许多C语言初学者对它的用法不甚了解.事实上,我们可以用typedef来定义自己习惯使用的数据类型名称,可以替代自己所熟悉的基本类型.数组类型.指针类 ...

  7. C语言中extern关键字的使用

    C语言中extern关键字的使用,直接上代码. file1.c文件 #include<stdio.h> extern long power(int); int A = 2; int mai ...

  8. java可以使用c语言中的输入,c语言中的scanf在java中应该怎么表达,Scanner类。

    1 java是面向对象的语言 它没有像C语言中的scanf()函数,但是它的类库中有含有scanf功能的函数 2 java.util包下有Scanner类 Scanner类的功能与scanf类似 3 ...

  9. 【✊基础不牢,地动山摇のC语言中static关键字✊】

    C语言中static关键字 用static声明限定外部变量与函数,可以将其后声明的对象的作用域限定为被编译源文件的剩余部分.要降对象指定为静态存储,可以在正常的声明之前加上关键字static作为前缀. ...

最新文章

  1. 入门深度学习,但你知道哪些情况下不该使用深度学习吗?
  2. 荐号 | 技术人如何在职场竞争中处于优势地位
  3. 判断链表中是否有环(环形链表)
  4. sql优化ppt_一款跨平台免费的开源 SQL 编辑器和数据库管理器!
  5. 文巾解题 797. 所有可能的路径
  6. Linux内存管理之一 分段与分页
  7. c语言推箱子给上颜色,本人的C语言大作业——推箱子
  8. 【kafka】kafka 消息 重放 从 一个 topic 导入 另外一个 topic
  9. CF719E. Sasha and Array [线段树维护矩阵]
  10. 英国电信选择由 Canonical 开发的 Ubuntu OpenStack 作为云平台
  11. Android消除Toast延迟显示
  12. 仓储管理之计价方法——移动加权平均法
  13. min函数python_python内置函数之min
  14. Visio绘图工具,“连接线”命令使用方法
  15. js刻度尺插件_html5 canvas+js刻度尺代码
  16. 数模国赛计算机要学什么,数学建模国赛经验分享
  17. word修订模式怎么彻底关闭_如何去掉word修订模式
  18. 使用YOLOX进行物体检测
  19. torch当中的MseLoss的reduction参数
  20. 新版Edge检查项F12控制台改为英文

热门文章

  1. Android 图片 Drawable介绍
  2. 花色苷植物代谢物质靶向代谢检测
  3. java后端技术路线,Java高级工程师进阶学习
  4. Java二维数组输出猫狗
  5. NEO-7M定位信息转换
  6. 51单片机DS18B20温度传感器
  7. tcp timewait closewait 过多情况
  8. 首次写爬虫!,requests库加beautifulsoup(美味汤)爬取学校教室课程表
  9. VL6180X距离、光线传感器上手体验
  10. Ubuntu更换清华TUNA软件源