restrict关键字用法
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关键字用法相关推荐
- C语言中关键字restrict的用法(linux 为 __restrict)
类型限定词restrict 关键字restrict通过允许编译器优化某几种代码增强了计算支持.它只可用于指针,并表明指针是访问一个数据对象的惟一且初始的方式.为了清楚这样做为何有用,我们需要看一些例子 ...
- C语言中restrict的意义,restrict关键字在C ++中的含义是什么?
正如其他人所说,如果C ++ 14中没有任何意义,那么让我们考虑一下__restrict__与C99相同的GCC扩展restrict. C99 restrict说两个指针不能指向重叠的内存区域.最常见 ...
- php全局变量的关键字,PHP变量作用域(全局变量局部变量)globalstatic关键字用法实例分析...
本文实例讲述了PHP变量作用域(全局变量&局部变量)&global&static关键字用法.分享给大家供大家参考,具体如下: 我们知道,变量呢,其实就相当于我们用来储存信息的容 ...
- 通过反汇编来理解restrict关键字
一次难忘的面试经历 多年前,一次互联网某厂实习生的面试题,题目的代码片段很简单,如下: 1 #include 2 int main()3 {4 int *restrict pInt = (int*)m ...
- java private 命名_java private关键字用法实例
这篇文章主要介绍了java private关键字用法实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 package java04; /* * 问 ...
- C++:C++中public protected private关键字用法
C++:C++中public protected private关键字用法 笔者这里主要针对C++中public protected private关键字做一个较全面的总结.首先public prot ...
- 设计模式--模板方法模式--Java实现-- java访问控制关键字用法
1.什么是模板方法 2.具体实现步骤 5.优缺点 6适用场景 java访问控制关键字用法 – protected的解释 (1)私有的:用关键字private修饰,只有本类可见. (2)默认的:不用访问 ...
- mysql常见关键字的用法_MySQL 常用关键字用法详解
MySQL 常用关键字用法详解 在开发工程中,操作数据库的时候经常会有不同类型的条件查询,除了使用where外,Mysql本身也提供了很多常用的关键字.本文主要介绍一些常用的关键字,像update.i ...
- java中的就近原则、方法中值传递和引用传递的区别、什么是构造方法、this关键字用法、什么是封装
你知道java中的就近原则嘛? package com.Test.java; /*** * 在java里面有一个"就近原则"详情可以参照下面代码**/public class Ac ...
最新文章
- iBATIS配置文件的特殊使用方法
- 打算写一个ASM集成开发环境
- 微软 WinGet 抄袭 AppGet 始末,个人开源的困境该如何破?
- 【Eviews】第九周实验-二次/对数拟合、预测
- 关于vc6 在mfc ClassWizard中无法添加成员变量
- SpringBoot开发案例之整合Spring-data-jpa
- php伪静态是什么,php路由设置伪静态
- DFS序+线段树 hihoCoder 1381 Little Y's Tree(树的连通块的直径和)
- ceph auth get boostrap-osd_那些某橙色软件都能GET到手的有文凭粗粮 速速前来种草
- 深度学习需要掌握的 13 个概率分布
- 【异常 1】什么是异常
- 给云服务器上传文件,如何给云服务器上传文件
- vue json对象转数组_Vue优秀表单组件,用Vue构建表单的最简单方法——Vue Formulate
- 为echarts的叠加柱状图设置颜色
- 南邮 OJ 2001 水獭看动漫
- Android4.0的StatusBar和NavigationBar
- 从零搭建Spring Boot脚手架:开篇以及技术选型1
- 第5天-[21天学Python]-Python中自定义函数及调用的方法
- ad中电容用什么封装_何为无极性电容?是干什么用的?
- 震惊!某程序员吐槽零基础自学编程很难,真的是这样吗?
热门文章
- 针对搜狗网址导航评论
- 计算机专业英语常用名词 微盘,298是什么意思
- DS18B20温度传感器FPGA实现
- linux如何创建计划任务,linux如何创建计划任务
- Discuz!论坛运营之修改帖子10000字节长度限制最大字数的方法
- LTE:Buffer Status Report(BSR)
- 环保和节能要求越来越高,暖通空调需不断提高产品的环保性和能源利用效率...
- php怎么保存hex数据,php脚本l导出mysq的blob格式数据-hex和unhex的用法
- 静默接口(Silent-interface)
- #C++# #likely# #unlikely#减少CPU流水线分支预测错误带来的性能损失