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 关键字的作用相关推荐

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

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

  2. C语言 const、static、volatile等关键字的作用

    目录 前言 const static volatile extern 总结 前言 C语言里面有许多关键字,本文结合我自己的了解简单讲讲几个常用关键字的作用. const 问:const有什么用? 答: ...

  3. c++语言static作用,详解c++中的 static 关键字及作用

    注:若没有特指是 静态成员时,默认都是普通成员: 1 类中的普通成员 类中的成员变量 和 成员函数 是分开存储的.其中, 1)每个对象都有独立的成员变量:成员变量可以存储在 栈空间.堆空间.全局数据区 ...

  4. c语言 static 关键字的作用

    static 关键字的作用 全局静态变量 局部静态变量 静态函数 类的静态成员 类的静态函数 全局静态变量 在全局变量前加上关键字 static,全局变量就定义成一个全局静态变量. 静态存储区,在整个 ...

  5. 在c语言中定义共用型数据类型的关键字是,C语言的关键字共有32个,根据关键字的作用,可分其为数据类型关键...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 C语言32个关键字2009年07月09日 星期四 下午 03:57复习一下: 第一个关键字:auto 用来声明自动变量. 可以显式的声明变量为自动变量.只 ...

  6. c语言中{的作用,C语言中Static和Const关键字的作用

    C语言中Static和Const关键字的作用 程序的局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据存在于(堆)中.那么关于C语言中Static和Const关键字的作用,你了解多少 ...

  7. 在c语言中保留字是有专门含义和作用的,c语言中的关键字和保留字的区别?

    c语言中的关键字和保留字的区别?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! c语言中的关键字和保留字的区别? 在C语 ...

  8. C语言的一个关键字——static

    C语言的一个关键字--static Static在C语言里面有两个作用,第一个是修饰变量,第二个是修饰函数. 1.Static修饰变量 按照作用范围的不同,变量分为局部变量和全局变量.如果用stati ...

  9. [partial] C#里partial关键字的作用

    [partial] C#里partial关键字的作用 1. 什么是局部类型? C# 2.0 引入了局部类型的概念.局部类型允许我们将一个类.结构或接口分成几个部分,分别实现在几个不同的.cs文件中. ...

最新文章

  1. 剑指offer:第一个只出现一次的字符
  2. 字节跳动 java面经_字节跳动Java面经(已offer)
  3. RuntimeError: Model class django.contrib.sites.models.Site doesn't declare an explicit app_label and
  4. .NET Core中的认证管理解析
  5. 虚拟技术必须解决的问题_VR/3D虚拟实验室亮相重庆市初中物理青年教师优质课大赛...
  6. Java面试之锁-读写锁
  7. java学习笔记_Java大白话学习笔记(01)—数组以及内存图解
  8. 解决串口数据接收,实际值FF,接收却是FFFFFFFF
  9. 超简单的html登录界面
  10. ZTree的API文档分享
  11. 特斯拉灯光秀指南「GitHub 热点速览 v.22.01」
  12. 我的世界java1.15更新了什么动物_我的世界:1.15版本这几种生物或许会加入,你期待哪种?...
  13. nginx新增conf文件
  14. 计算机网络之应用层(DNS域名系统)
  15. c语言字节类型(bytes),Python bytes类型及用法
  16. QImage 图片分割、保存
  17. CodeForces - 1255B Fridge Lockers 思维+建图)
  18. Simpack 2020.1 一种报错的解决方法No license for simat...
  19. c++深度优先搜索详解
  20. 编译2.6内核模块出问题了,尚未解决.............

热门文章

  1. 人工智能到底是什么?AI可以涵盖哪些领域?
  2. contiki学习笔记 clock部分
  3. 〖Python语法进阶篇⑱〗- 综合实战 - 抽奖系统之admin模块 - 抽奖系统之admin模块 - 实现对奖品的增删改操作
  4. Axon Framework官方文档(五)
  5. 求n的阶乘,求1~n的阶乘和(循环)
  6. Git详解之四 服务器上的Git
  7. NIB 和 XIB 的区别
  8. 001_Whetting Your Appetite_引言
  9. 【CSS】记踩坑-图片3D旋转设置景深perspective
  10. 如何在vs code中配置miniconda/anaconda环境(两种方法)