c99中新增加了一个类型定义,就是restrict。

概括的说,关键字restrict只用于限定指针;该关键字用于告知编译器,所有修改该指针所指向内容的操作全部都是基于(base on)该指针的,即不存在其它进行修改操作的途径;这样的后果是帮助编译器进行更好的代码优化,生成更有效率的汇编代码。

举个简单的例子

int foo (int* x, int* y) {*x = 0;*y = 1;return *x;
}

很显然函数foo()的返回值是0,除非参数x和y的值相同。可以想象,99%的情况下该函数都会返回0而不是1。然而编译起必须保证生成100%正确的代码,因此,编译器不能将原有代码替换成下面的更优版本

int f (int* x, int* y) {*x = 0;*y = 1;return 0;
}

现在我们有了restrict这个关键字,就可以利用它来帮助编译器安全的进行代码优化了

int f (int *restrict x, int *restrict y) {*x = 0;*y = 1;return *x;
}

此时,由于指针 x 是修改 *x的唯一途径,编译起可以确认 “*y=1; ”这行代码不会修改 *x的内容,因此可以安全的优化为

int f (int *restrict x, int *restrict y) {*x = 0;*y = 1;return 0;
}

最后注意一点,restrict是C99中定义的关键字,C++目前并未引入;在GCC可通过使用参数” -std=c99”
来开启对C99的支持

下面是我从C语言核心技术一书上摘的:

void *memcpy( void * restrict dest , const void * restrict src, size_t n) 

这是一个很有用的内存复制函数,由于两个参数都加了restrict限定,所以两块区域不能重叠,即 dest指针所指的区域,不能让别的指针来修改,即src的指针不能修改. 相对应的别一个函数 memmove(void *dest, const void *src, size_t)则可以重叠。

restrict关键字用法相关推荐

  1. C语言中关键字restrict的用法(linux 为 __restrict)

    类型限定词restrict 关键字restrict通过允许编译器优化某几种代码增强了计算支持.它只可用于指针,并表明指针是访问一个数据对象的惟一且初始的方式.为了清楚这样做为何有用,我们需要看一些例子 ...

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

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

  3. php全局变量的关键字,PHP变量作用域(全局变量局部变量)globalstatic关键字用法实例分析...

    本文实例讲述了PHP变量作用域(全局变量&局部变量)&global&static关键字用法.分享给大家供大家参考,具体如下: 我们知道,变量呢,其实就相当于我们用来储存信息的容 ...

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

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

  5. java private 命名_java private关键字用法实例

    这篇文章主要介绍了java private关键字用法实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 package java04; /* * 问 ...

  6. C++:C++中public protected private关键字用法

    C++:C++中public protected private关键字用法 笔者这里主要针对C++中public protected private关键字做一个较全面的总结.首先public prot ...

  7. 设计模式--模板方法模式--Java实现-- java访问控制关键字用法

    1.什么是模板方法 2.具体实现步骤 5.优缺点 6适用场景 java访问控制关键字用法 – protected的解释 (1)私有的:用关键字private修饰,只有本类可见. (2)默认的:不用访问 ...

  8. mysql常见关键字的用法_MySQL 常用关键字用法详解

    MySQL 常用关键字用法详解 在开发工程中,操作数据库的时候经常会有不同类型的条件查询,除了使用where外,Mysql本身也提供了很多常用的关键字.本文主要介绍一些常用的关键字,像update.i ...

  9. java中的就近原则、方法中值传递和引用传递的区别、什么是构造方法、this关键字用法、什么是封装

    你知道java中的就近原则嘛? package com.Test.java; /*** * 在java里面有一个"就近原则"详情可以参照下面代码**/public class Ac ...

最新文章

  1. iBATIS配置文件的特殊使用方法
  2. 打算写一个ASM集成开发环境
  3. 微软 WinGet 抄袭 AppGet 始末,个人开源的困境该如何破?
  4. 【Eviews】第九周实验-二次/对数拟合、预测
  5. 关于vc6 在mfc ClassWizard中无法添加成员变量
  6. SpringBoot开发案例之整合Spring-data-jpa
  7. php伪静态是什么,php路由设置伪静态
  8. DFS序+线段树 hihoCoder 1381 Little Y's Tree(树的连通块的直径和)
  9. ceph auth get boostrap-osd_那些某橙色软件都能GET到手的有文凭粗粮 速速前来种草
  10. 深度学习需要掌握的 13 个概率分布
  11. 【异常 1】什么是异常
  12. 给云服务器上传文件,如何给云服务器上传文件
  13. vue json对象转数组_Vue优秀表单组件,用Vue构建表单的最简单方法——Vue Formulate
  14. 为echarts的叠加柱状图设置颜色
  15. 南邮 OJ 2001 水獭看动漫
  16. Android4.0的StatusBar和NavigationBar
  17. 从零搭建Spring Boot脚手架:开篇以及技术选型1
  18. 第5天-[21天学Python]-Python中自定义函数及调用的方法
  19. ad中电容用什么封装_何为无极性电容?是干什么用的?
  20. 震惊!某程序员吐槽零基础自学编程很难,真的是这样吗?

热门文章

  1. 针对搜狗网址导航评论
  2. 计算机专业英语常用名词 微盘,298是什么意思
  3. DS18B20温度传感器FPGA实现
  4. linux如何创建计划任务,linux如何创建计划任务
  5. Discuz!论坛运营之修改帖子10000字节长度限制最大字数的方法
  6. LTE:Buffer Status Report(BSR)
  7. 环保和节能要求越来越高,暖通空调需不断提高产品的环保性和能源利用效率...
  8. php怎么保存hex数据,php脚本l导出mysq的blob格式数据-hex和unhex的用法
  9. 静默接口(Silent-interface)
  10. #C++# #likely# #unlikely#减少CPU流水线分支预测错误带来的性能损失