C语言的 restrict 关键字的作用
restrict 这个关键字到底有什么用,还是用代码看得清楚。这里,c 标准说明中用了如下的例子:
#include <stdio.h>int foo(int *a, int *b)
{*a = 5;*b = 6;return *a + *b;
}int rfoo(int *restrict a, int *restrict b)
{*a = 5;*b = 6;return *a + *b;
}void main(void)
{int i =0;int *a = &i;int *b = &i;printf("%d ",foo(a,b)); // 输出 12printf("%d ", rfoo(a,b)); // 可能输出 11
}
那么,我们看看到底为什么2函数可能会分别返回12/11?
再看c说明文档,它让我们用生成汇编来看看。比如在64位下,gcc 用 -S,vc用 /FA 编译,那么foo / rfoo 可能得到如下的汇编代码:
foo:movl $5, (%rdi) # 存 5 到 *amovl $6, (%rsi) # 存 6 到 *bmovl (%rdi), %eax # 从 *a 读数到累加寄存器 eaxaddl $6, %eax # 对 eax 加 6ret # 返回 (整型返回值就是 eax 的数)rfoo:movl $11, %eax # 给 eax 存 11, 因为 restrict 指示编译器可随意优化movl $5, (%rdi) # 存 5 到 *amovl $6, (%rsi) # 存 6 到 *bret # 返回
foo 函数,老老实实地按c的写法,先放5到a地址,再放6到b地址,2次都用i的地址,i是6,6+i = 6+6=12
rfoo函数指示了编译器a,b地址是独立的,可以随意优化,那么一分析,是写死的5+6,没必要运算啊,就返回11嘛!
现代的计算机很复杂,有单指令流/多指令流多数据流(SIMD/MIMD)等等的结构,要指导编译器能充分利用资源生成有效率的代码,用restrict这样的修饰就很有必要了。
C语言的 restrict 关键字的作用相关推荐
- 通过反汇编来理解restrict关键字
一次难忘的面试经历 多年前,一次互联网某厂实习生的面试题,题目的代码片段很简单,如下: 1 #include 2 int main()3 {4 int *restrict pInt = (int*)m ...
- C语言 const、static、volatile等关键字的作用
目录 前言 const static volatile extern 总结 前言 C语言里面有许多关键字,本文结合我自己的了解简单讲讲几个常用关键字的作用. const 问:const有什么用? 答: ...
- c++语言static作用,详解c++中的 static 关键字及作用
注:若没有特指是 静态成员时,默认都是普通成员: 1 类中的普通成员 类中的成员变量 和 成员函数 是分开存储的.其中, 1)每个对象都有独立的成员变量:成员变量可以存储在 栈空间.堆空间.全局数据区 ...
- c语言 static 关键字的作用
static 关键字的作用 全局静态变量 局部静态变量 静态函数 类的静态成员 类的静态函数 全局静态变量 在全局变量前加上关键字 static,全局变量就定义成一个全局静态变量. 静态存储区,在整个 ...
- 在c语言中定义共用型数据类型的关键字是,C语言的关键字共有32个,根据关键字的作用,可分其为数据类型关键...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 C语言32个关键字2009年07月09日 星期四 下午 03:57复习一下: 第一个关键字:auto 用来声明自动变量. 可以显式的声明变量为自动变量.只 ...
- c语言中{的作用,C语言中Static和Const关键字的作用
C语言中Static和Const关键字的作用 程序的局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据存在于(堆)中.那么关于C语言中Static和Const关键字的作用,你了解多少 ...
- 在c语言中保留字是有专门含义和作用的,c语言中的关键字和保留字的区别?
c语言中的关键字和保留字的区别?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! c语言中的关键字和保留字的区别? 在C语 ...
- C语言的一个关键字——static
C语言的一个关键字--static Static在C语言里面有两个作用,第一个是修饰变量,第二个是修饰函数. 1.Static修饰变量 按照作用范围的不同,变量分为局部变量和全局变量.如果用stati ...
- [partial] C#里partial关键字的作用
[partial] C#里partial关键字的作用 1. 什么是局部类型? C# 2.0 引入了局部类型的概念.局部类型允许我们将一个类.结构或接口分成几个部分,分别实现在几个不同的.cs文件中. ...
最新文章
- 剑指offer:第一个只出现一次的字符
- 字节跳动 java面经_字节跳动Java面经(已offer)
- RuntimeError: Model class django.contrib.sites.models.Site doesn't declare an explicit app_label and
- .NET Core中的认证管理解析
- 虚拟技术必须解决的问题_VR/3D虚拟实验室亮相重庆市初中物理青年教师优质课大赛...
- Java面试之锁-读写锁
- java学习笔记_Java大白话学习笔记(01)—数组以及内存图解
- 解决串口数据接收,实际值FF,接收却是FFFFFFFF
- 超简单的html登录界面
- ZTree的API文档分享
- 特斯拉灯光秀指南「GitHub 热点速览 v.22.01」
- 我的世界java1.15更新了什么动物_我的世界:1.15版本这几种生物或许会加入,你期待哪种?...
- nginx新增conf文件
- 计算机网络之应用层(DNS域名系统)
- c语言字节类型(bytes),Python bytes类型及用法
- QImage 图片分割、保存
- CodeForces - 1255B Fridge Lockers 思维+建图)
- Simpack 2020.1 一种报错的解决方法No license for simat...
- c++深度优先搜索详解
- 编译2.6内核模块出问题了,尚未解决.............