restrict是c99引入的,它只可以用于限定指针,并表明指针是访问一个数据对象的唯一且初始的方式.
  仅当第二个指针基于第一个时,才能对对象进行存取.

例子  考虑下面的例子:
  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,编译器就可以放心地进行优化了。

void *memcpy(void * restrict s1,const void * restrict s2,size_t n);
如果拷贝发生在两个重叠的对象之间,行为是不确定的。
void *memmove(void *s1, constvoid *s2, size_t n);
即使两个指针指向的区域互相重叠,拷贝也不会受影响。

值得注意的是,一旦你决定使用restrict来修饰指针,你必须得保证它们之间不会互相重叠,编译器不会替你检查。

 

void setbuf (FILE *restrict fp,char *restrict buf);
表示fp和buf所指内存空间不交叉
这个关键字与优化有关。
比方
void func(int*a,int*b)
{
    *a+=*b;
    *a+=*b;
}
本来可以优化为
void func(int*a,int*b)
{
    *a+=*b<<1;
}
可是如果a和b指向同一整型,两个函数语意就不一样了。
因为有这种风险,于是很多编译器便不会这么优化了。
现在加了restrict关键字,编译器就可以大胆的做这种优化了
另外,对于优化而言,restrict,register关键字是建议性的,而volatile关键字是强制性的

UNIX中的restrict相关推荐

  1. UNIX中文件描述符和文件指针

    文件描述符 在C程序中,文件由文件指针或者文件描述符表示.ISO C的标准I/0库函数(fopen, fclose, fread, fwrite, fscanf, fprintf等)使用文件指针,UN ...

  2. 什么是SUID?在Linux/Unix中如何设置SUID

    文件中除了普通的读.写.执行权限外,还有一些特殊的权限,我们可以使用 chmod和chown命令来设置. 他们分别是SUID, SGID, Stricky Bit, ACL's, SUDO and S ...

  3. Linux/Unix中的重定向简单实例

    "重定向"是指修改原来默认的一些东西,对原来系统命令的默认执行方式进行改变.令程序与文件一同工作的方式有两种:一种是明确地使用打开文件.关闭文件.读文件.写文件等专门的函数(比如f ...

  4. linux顺序合并多个文件,linux – 合并多个文件,保留unix中的原始序列

    我在目录中有多个(超过100个)文本文件,例如 files_1_100.txt files_101_200.txt 该文件的内容是一些变量的名称,如files_1_100.txt包含一些介于1到100 ...

  5. UNIX中的文件和目录

    文件--索引节点 POSIX没有强制磁盘上的文件采取任何特定的表示方法,但是传统的UNIX文件都是按照改进的树状结构来实现的.目录项中包含一个文件名 和一个定长结构的引用(索引节点).索引节点包含与文 ...

  6. UNIX中的Poll函数

    poll函数和select函数非常相似,但是函数接口不一样. int poll(struct pollfd fdarray[], nfds_t nfds, int timeout); int sele ...

  7. UNIX中后台进程与守护进程

    后台进程 默认情况下,进程是在前台运行的,这时就把shell给占据了,我们无法进行其它操作.对于那些没有交互的进程,很多时候,我们希望将其在后台启动,可以在启动参数的时候加一个'&'实现这个目 ...

  8. 使用 ACE 库框架在 UNIX 中开发高性能并发应用

    ACE 开放源码工具包可以帮助开发人员创建健壮的可移植多线程应用程序.本文讨论创建使用 ACE 线程的应用程序的一些方法. Adaptive Communication Environment (AC ...

  9. Unix中的I/O模型和Java NIO

    Unix网络编程中的五种I/O模型 阻塞式I/0.非阻塞I/O.I/O复用.信号驱动式I/O.异步I/O 以一个网络输入为例,一个输入操作通常包括两个不同的阶段: 等待数据准备好,将数据从内核拷贝到进 ...

最新文章

  1. ICCV 2019 | 加一个任务路由让数百个任务同时跑起来,怎么做到?
  2. 我必须得告诉大家的MySQL优化原理
  3. nginx header参数丢失_Nginx 性能优化有这篇就够了!
  4. android sql 顺序执行问题,怎么才能执行第一个完毕,才能继续执行第二个
  5. final关键字用法
  6. 混沌图像---三翅鹰
  7. python界面设计-python图形化界面设计tkinter
  8. [Leedcode][JAVA][第289题][生命游戏]
  9. 推荐几个单细胞数据分享和展示平台 | 短视频演示
  10. idea war包和jar包区别 以及用maven如何打包
  11. Java的jps命令使用详解
  12. matlab热度图确定色标_MATLAB 颜色图函数(imagesc/scatter/polarPcolor/pcolor)
  13. 【已失效】创维DT741-csf光猫管理员/root超级密码获取方法
  14. javaScript用函数的方式计算体重是否是标准体重(代码)
  15. redis持久化底层原理-RDB与AOF
  16. ffmpeg 一条命令实现 圆形画中画效果
  17. Fasterrcnn代码个人精细解读(先验框生成部分)
  18. 【Linux进程概念——上】冯 • 诺依曼体系结构 | 操作系统 | 进程 | fork | 进程状态 | 优先级
  19. 计算机无法设置壁纸黑屏,电脑界面为什么无法换壁纸 一直黑屏 但有图标
  20. 医院PACS系统源码,PACS源码,带3D重建PACS系统源码

热门文章

  1. 开发人员应该对IIS理论层的知识了解的多一些~第四讲 HttpModule中的几大事件
  2. 用Python让单片机“行动”起来——MicroPython实战入门篇
  3. leetcode题目解答报告(1)
  4. 理论实践都重要,交换机安装全接触
  5. 我要放弃RedHat Linux了
  6. jquery 封装页面之间获取值
  7. 背包系列 hdu3449 有依赖背包
  8. LAMP中apache的配置步骤
  9. android adb端口被占用问题解决办法
  10. iOS开发UI篇—Date Picker和UITool Bar控件简单介绍