引言:在内核的系统调用函数里,常常遇到函数的參数使用restrict限定词限定的情况,以下就对该关键词做个总结。

1、restrict关键词是C99特性才加入的,因此在编译使用含有该限定词的程序时,一定要在后边加入-std=c99的标志,使得gcc能够支持c99标准。

2、restrict既然是个限定词。那么它限定什么变量呢?它仅仅能限定指针变量。经过它限定的数据对象,表明指针时訪问该数据对象的唯一且初始的方式。注意:这里的唯一表明了,由它限定的指针所指向的数据块。仅仅能由该指针訪问,不能由除它之外的不论什么方式訪问。初始指的是它必须在初始化的时候声明,不能再以后声明。后面给出样例解释。

3、restrict事实上能够看成仅仅有两个读者。一个是编译器,它告诉编译器能够自由地做一些有关优化的假定。

还有一个读者是用户,它告诉用户仅适用满足restrict要求的參数。比方,下列两个函数声明:

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

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

上面两个函数都是从位置s2把n个字节拷贝到位置s1。

函数memcpy()要求两个位置之间不重叠。但memmove()没有这个要求。

把s1和s2声明为restrict意味着每一个指针都是对应数据的唯一訪问方式,因此他们不能訪问同一数据块。这满足了不能有重叠的要求。

程序演示样例restrict.c:

#include <stdio.h>
#include <stdlib.h>int
main(int argc, char **argv)
{int n;int ar[5];int    *restrict restar = (int *)malloc(5 * sizeof(int));/*将该指针声明为了restrict。使得这块内存的数据仅仅能由restar訪问,不能由以下的par指针訪问*/int *par = ar;for(n = 0; n < 5; n++){par[n] += 5;restar[n] += 5;ar[n] *= 2;par[n] += 3;restar[n] += 3;    printf("ar[%d] = %d\n", n, restar[n]);printf("ar[%d] = %d\n", n, ar[n]);}return -1;
}

编译:gcc restrict.c -std=c99

运行编译结果:./a.out

ar[0] = 8
ar[0] = 4851221
ar[1] = 8
ar[1] = 4849653
ar[2] = 8
ar[2] = 269027981
ar[3] = 8
ar[3] = 2147391485
ar[4] = 8
ar[4] = 2614935

从结果能够看出,通过par指针以及ar所訪问的restar指针所指向的数据并没有起不论什么作用。

能够改变所指向内存数据的仅仅是restar[n] += 5;与 resatr[n] += 3;这两条语句。事实上编译器会对这两条语句做优化,将它们合并成一条语句:restar[n] += 8;

转载于:https://www.cnblogs.com/ldxsuanfa/p/10031437.html

【C语言天天练(十九)】restrict关键词相关推荐

  1. C++语言学习(十九)——C++类型识别

    C++语言学习(十九)--C++类型识别 一.C++类型识别简介 1.C++类型识别简介 C++是静态类型语言,其数据类型是在编译期就确定的,不能在运行时更改. C++语言中,静态类型是对象自身的类型 ...

  2. 【C语言天天练(二四)】内存分配

    引言: 对于C语言程序,了解它执行时在内存中是怎样分配的对于我们理解它的执行机制是很实用的.以下就总结一下C语言程序的一些内存分配知识. 一 一段C程序.编译连接后形成的可运行文件一般有代码段.数据段 ...

  3. C语言试题六十九之请编写函数判断一个数是不是素数

    1. 题目 编写函数:判断一个数是不是素数 素数:素数又称质数.所谓素数是指除了 1 和它本身以外,不能被任何整数整除的数,例如17就是素数,因为它不能被 2~16 的任一整数整除. 2 .温馨提示 ...

  4. C语言试题五十九之请编写一个函数fun,它的功能时:求fibonacci数列中大于t的最小的一个数,结果由函数返回。

    1. 题目 请编写一个函数fun,它的功能时:求fibonacci数列中大于t的最小的一个数,结果由函数返回. 其中fibonacci数列f(n)的定义为:f(0)=0,f(1)=1,f(n)=f(n ...

  5. C语言试题四十九之只删除字符串前导和尾部的*号,串中字母之间的*号都不删除。 n 给出了字符串的长度,h字符串中前导*号的个数,e给出了字符串中最后的*个数

    1. 题目 假定输入的字符串中只包含字母和*号.请编写函数function,它的功能是:只删除字符串前导和尾部的*号,串中字母之间的*号都不删除.形参n 给出了字符串的长度,形参h给出了字符串中前导* ...

  6. C语言试题三十九之将s所指字符串中除了下标为奇数、同时ascii值也为奇数的字符外,其余的全都删除;串中剩余字符所形成的一个新串放在t所指的一个数组中。

    1. 题目 请编写一个函数function,它的功能是:将s所指字符串中除了下标为奇数.同时ascii值也为奇数的字符外,其余的全都删除:串中剩余字符所形成的一个新串放在t所指的一个数组中. 2 .温 ...

  7. C语言试题二十九之编写函数int function(int lim,int aa[max])求出小于或等于lim的所有素数并放在aa数组中,该函数返回所求的素数的个数。

    1. 题目 编写函数int function(int lim,int aa[max]),该函数的功能是求出小于或等于lim的所有素数并放在aa数组中,该函数返回所求的素数的个数. 2 .温馨提示 C语 ...

  8. 2021年大数据常用语言Scala(十九):基础语法学习 iterator迭代器

    目录 iterator迭代器 使用迭代器遍历集合 iterator迭代器 scala针对每一类集合都提供了一个迭代器(iterator)用来迭代访问集合 使用迭代器遍历集合 使用iterator方法可 ...

  9. java程序 构建mycircle类_Java语言程序设计(十九)对象和类的应用实例

    1.我们定义一个Circle类并使用该类创建对象,我们创建三个圆对象,1.0,25和125,然后显示这三个圆的半径和面积,将第二个对象的半径改为100,然后显示它的新半径和面积.程序清单如下: pac ...

最新文章

  1. JSP内置对象基础知识小结
  2. 开启2020高效办公,从团队知识管理开始
  3. error 图片,加载错误-》实用笔记
  4. Go语言(Golang)约瑟夫游戏(Joseph)
  5. SharePoint 2013创建应用程序时IIS端口文件夹下没文件
  6. crud-table_我个人的CRUD故事-或我如何来到CUBA平台
  7. 企业战略咨询方法:学习SWOT分析
  8. php post undefined index,PHP 中提示undefined index如何解决(多种方法)
  9. java随机数_Java随机
  10. KEIL5编译51单片机程序依赖包
  11. 网站实现GNSS数据批量下载
  12. JDBC bug : You must configure either the server or JDBC driver
  13. UE4 Pak相关:加载Pak内模型Mesh/SkMesh没有材质
  14. DZY Loves Math 系列详细题解
  15. 声明式导航编程式导航
  16. [附源码]SSM计算机毕业设计领导干部听课评课管理系统JAVA
  17. 我的CTF之旅(四)
  18. Python编程与其他编程语言相比有何优势?
  19. DynamicViT论文概要
  20. 卷毛崽|Linux自学|Vim 编辑器与 Shell 命令脚本

热门文章

  1. 红帽linux安装vnc,redhat企业7.0安装VNC
  2. 年度调薪一般涨多少_涨了!长沙各小区房价曝光!快来看看你的房子涨了多少钱...
  3. java的连接 初始化_java类从加载、连接到初始化过程详解
  4. 工厂利用计算机实现温度调节属于,工厂利用计算机系统实现温度调节、阀门开关,该应用属于()。A.过程控制B.数据处理C.科学计算D.C...
  5. 2016OSC源创会年终盛典-前端技术专场-阴明
  6. 如何才能快速匹配到大号?
  7. Spring Framework 4.2 中的新功能和增强功能
  8. Thrift原理与使用实例
  9. window8.1中用户的管理员权限的提升方法
  10. 关于maven modules开发时候,eclipse的dubug模式不能找到源代码