restrict关键
http://bdxnote.blog.163.com/blog/static/84442352010017185053/
restrict关键字的含义是:约束、限定、严格的;
这个关键字是C99标准中新增加的;
简单地说,restrict关键字只用于限定和约束指针;它告诉编译器,所有修改该指针所指向内存中内容的操作,全都必须基于(base on)该指针,即:不存在其它进行修改操作的途径;换句话说,所有修改该指针所指向内存中内容的操作都必须通过该指针来修改,而不能通过其它途径(其它变量或指针)来修改;这样做的好处是,能帮助编译器进行更好的优化代码,生成更有效率的汇编代码;
实验:
int test_restrict(int* x, int* y)
{
*x = 0;
*y = 1;
return *x;
}
很显然,test_restrict()函数的返回值是0,除非参数x和y的值相同;可以想象,99%的情况下该函数都会返回0而不是1;然而编译器必须保证生成100%正确的代码,因此,编译器不能将原有代码替换成下面的更优版本的代码:
int test_restrict(int* x, int* y)
{
*x = 0;
*y = 1;
return 0; //<---直接替换成0;
}
C99标准中新增加了restrict这个关键字,关键字restrict就可以帮助编译器安全地进行代码优化了:
int test_restrict(int* restrict x, int* restrict y)
{
*x = 0;
*y = 1;
return *x;
}
由于使用restrict关键字来修饰参数x了,所以,指针x是修改指针x所指向内存中内容的唯一途径,编译器可以确认"*y = 1;"这行代码绝对不会修改*x的内容,因此,编译器可以安全地把代码优化为:
int test_restrict(int* restrict x, int* restrict y)
{
*x = 0;
*y = 1;
return 0; //<---直接替换成0;
}
注意:关键字restrict是C99标准中新增加的关键字,C++目前仍未引入;编译时,可通过在gcc的命令行使用参数"-std=c99"来开启对C99标准的支持;即:目前C++语言还不支持关键字restrict,而C语言支持;所以,restrict关键字目前只能出现在.c文件中,而不能出现在.cpp文件中;
实验一:test_restrict.cpp
#include <stdio.h>
int test_restrict(int* restrict x, int* restrict y)
{
*x = 0;
*y = 1;
return *x;
}
int main(int argc, char** argv)
{
int a = -1, b = -2;
a = test_restrict(&a, &b);
return a;
}
此时,编译报错:
sxit@sxit-bqm:~/test> gcc -o test test_restrict.cpp -std=c99
cc1plus: warning: command line option "-std=c99" is valid for C/ObjC but not for C++
test_restrict.cpp:3: error: expected ',' or '...' before 'x'
test_restrict.cpp: In function 'int test_restrict(int*)':
test_restrict.cpp:5: error: 'x' was not declared in this scope
test_restrict.cpp:6: error: 'y' was not declared in this scope
test_restrict.cpp: In function 'int main(int, char**)':
test_restrict.cpp:3: error: too many arguments to function 'int test_restrict(int*)'
test_restrict.cpp:13: error: at this point in file
sxit@sxit-bqm:~/test>
报错了,在Solaris和Suse上报同样的错;把test_restrict.cpp重命名为test_restrict.c之后,就可以编译通过了:
sxit@sxit-bqm:~/test> gcc -o test test_restrict.c -std=c99
sxit@sxit-bqm:~/test>
使用restrict关键编译过的汇编代码:
test_restrict:
!#PROLOGUE# 0
!#PROLOGUE# 1
mov 4, %g1
st %g1, [%o0]
mov 1, %o5
st %o5, [%o1]
retl
mov 4, %o0 <------返回值:返回立即数4;说明已经被优化了;
.size test_restrict, .-test_restrict
.section ".rodata"
.align 8
没有使用restrict关键编译过的汇编代码:
test_restrict: -----without restrict
!#PROLOGUE# 0
!#PROLOGUE# 1
mov 4, %g1
st %g1, [%o0]
mov 1, %o5
st %o5, [%o1]
retl
ld [%o0], %o0 <------返回值:取变量的值作为返回值;说明没有被优化;
.size test_restrict, .-test_restrict
.section ".rodata"
转载于:https://blog.51cto.com/buaadallas/502011
restrict关键相关推荐
- 指令并行——单核并行编程说明1
本文描述DSP单核编程并行计算的处理: 1)Instruction Level Parallelism (ILP):指令集并行. (1)实现方式:VLIW(超长指令字). (2)VLIW优缺点:优点: ...
- 软件优化理论基础以及方法论小结.
就像我其他博文中说的,对于软件的优化除开算法,全部都是为流水线服务的.所以优化的时候要时刻记住一这点.由于优化的东西比较杂,我写的不是很好,所以在文章的最后,我会试着提炼出一些通用性的原则. 由于之前 ...
- hql中获取前一天的数据_PostgreSql 怎么获取数据库中关键系统信息(一)
如何通过SQL 的方式获得数据库中的一些关键信息,是一个DB最正常的工作,如何通过一些SQL来获得PG的一些关键的参数和信息或者是数据库中的一些信息是需要知道的一件事情.以下是部分 1 一般来说每种数 ...
- restrict / __restrict / __restrict__ 关键字
最近在RHEL7上使用字符串拷贝函数wcscpy(),发现出来的结果不对,好像是dest的缓冲区被破坏了: int main(){wchar_tbuf[256] = L"\n \n Tota ...
- 四六级写作中绝对用得到的关键词汇及短语汇总
作者: 小宝老师韦晓亮 寡人平时仍然坚持读报纸或者书籍时刻积累我将来自己写作时可以用到的词汇,这个建议希望大家不光是在应试英语的时候很应试的去这样做,应当养成一种习惯,你会发现,几乎所有同学的写作或者 ...
- Python 典型错误及关键知识点
1. 不要在 for 循环后面写 else 块 In [40]: for i in range(3):....: print i....: else:....: print "end&quo ...
- 嵌入式传感器是智能移动增长的关键
嵌入式传感器是智能移动增长的关键 Embedded sensors are key to smart mobility growth 由于移动即服务(mobility-as-a-service,Maa ...
- 管理多供应商物联网项目的10个关键步骤
管理多供应商物联网项目的10个关键步骤 10 critical steps for managing a multi-vendor IoT project 一旦您决定创建一个成功的端到端物联网应用开发 ...
- 先进机器人系统中的关键技术
先进机器人系统中的关键技术 Key technologies coalesce in advanced robotic systems 就在机器人设计进入商业领域,服务于制造业.物流业和服务业之际,概 ...
最新文章
- 基于OpenCV的车辆变道检测
- mega_[MEGA DEAL]完整的Java编程训练营(94%折扣)
- 面向新闻媒体的命名实体识别技术
- CRMEB系统开发文档
- 网络技术学习资料分享
- nashorn js 调用 java_从nashorn(JDK 8 JavaScript引擎)调用char []输入参数调用Java函数?...
- WPS for MacOS如何设置自动拼写检查
- git 拉取远程其他分支代码_【记录】git 拉取远程分支代码,同步到另一个git上...
- mac下安装nginx及相关配置
- delphi2007安装说明(备忘)
- 基于51单片机GPS的导航系统设计(1)---(设计思路)
- 云初起微方案中下单人、联系人、下载者三者之间是什么关系?
- 全能模拟器retroarch+android,全能模拟器(RetroArch Android)
- prompt learning——你需要掌握的基础知识以及离散型 prompt 的代码
- PageHelper分页永远返回第一页数据
- 1.3读论文笔记:M. Raissi a等人的Physics-informed neural networks:A deep learning framework for solving forw..
- uniapp 腾讯云活体人脸核身(超详细)
- 支付宝 收款通知 mysql_基于支付宝微信通知的一种个人收款回调方案(转)
- Exchange ActiveSync 配置
- 用Unity开发基于Oculus Rift的体验游戏时遇到天空盒重影问题的解决方法