C语言的restrict关键字

C语言面试题-C99中的restrict关键字详解 restrict是一个用于限定指针的关键字,一般定义int * restrict a,用来告知编译器,对于该指针指向的内容的修改,只能通过该指针实现,这样做的一个好处是,可以让编译器来更好的优化代码,生成效率更高的汇编代码。gcc编译时需要 加-std=c99 来实现对c99的支持。 阅读详情

简介

restrict是c99标准引入的,它只可以用于限定和约束指针,并表明指针是访问一个数据对象的唯一且初始的方式.即它告诉编译器,所有修改该指针所指向内存中内容的操作都必须通过该指针来修改,而不能通过其它途径(其它变量或指针)来修改;这样做的好处是,能帮助编译器进行更好的优化代码,生成更有效率的汇编代码.

由restrict修饰的指针主要用于函数形参,或指向由malloc()分配的内存空间。

通过GCC生成汇编指令的例子来更好的理解这个关键字

  • 没有restrict关键字声明的代码
    void f(int *a, int *b, int *c)
    {
    *a += *c;
    *b += *c;
    }
    将以上代码写入文件code.c,通过终端(terminal)中输入
    gcc -O2 -S code.c -o code.s
    注意:“-O2”中的O以及“-S”中的S需要大写
    生成的code.s文件内容如下:
    .section __TEXT,__text,regular,pure_instructions
    .macosx_version_min 10, 11
    .globl _f
    .align 4, 0x90
    _f: ## @f
    .cfi_startproc
    ## BB#0:
    pushq %rbp
    Ltmp0:
    .cfi_def_cfa_offset 16
    Ltmp1:
    .cfi_offset %rbp, -16
    movq %rsp, %rbp
    Ltmp2:
    .cfi_def_cfa_register %rbp
    movl (%rdx), %eax
    addl %eax, (%rdi)
    movl (%rdx), %eax
    addl %eax, (%rsi)
    popq %rbp
    retq
    .cfi_endproc

      .subsections_via_symbols
    

其中关键的汇编指令为:
movl (%rdx), %eax
addl %eax, (%rdi)
movl (%rdx), %eax
addl %eax, (%rsi)

  • 再看看有restrict关键字声明的代码
    void f(int * restrict a, int* restrict b, int* restrict c)
    {
    *a += *c;
    *b += *c;
    }
    通过上面一样的步骤生成汇编指令如下:
    movl (%rdx), %eax
    addl %eax, (%rdi)
    addl %eax, (%rsi)
    相较没有加restrict关键字声明的情况,优化了第二步的指针c加载。

总结

restrict关键字声明主要是帮助编译器更好的进行代码优化,实际上并不影响代码的写法。



作者:YummyDog
链接:https://www.jianshu.com/p/d32b24013a29

C语言中的`restrict`关键字 阅读详情

相关推荐

经典脉冲激光测距原理&雷达方程

脉冲激光测距机的工作过程如下:首先用瞄准光学系统瞄准目标,然后接通激光电源,储能电容器充电,产生触发闪光灯的触发脉冲,闪光灯点亮,激光器受激辐射,从输出反射镜发射出一个前沿陡峭、峰值功率高的激光脉冲,通过发射光学系统压缩光束发射角后射向目标。通过计算激光发射功率经介质传输的衰减,目标表面截获和反射的光功率,到达接收视场的光功率,以及接收光学系统接收到的光功率,就可以得到到达光电探测器的光功率,即接收功率。⑤光東路程上的折射率变化;),测量光脉冲到达目标并由目标返回到接收机的时间,由此计算出目标的距离。

weixin_46153372的博客 2521

C - 关键字 - restrict

【代码】C - 关键字 - restrict。

qazw9600的专栏 4377

大模型备案避坑指南:如何设计符合TC260标准的评估测试题集?

本文深入探讨了如何设计符合TC260标准的大模型评估测试题集,以顺利通过备案。文章从解构标准核心逻辑出发,详细阐述了题集设计的工程化流程、核心原则与常见误区,并提供了模拟真实对抗的高阶测试策略与度量分析方法,旨在帮助企业构建一套能真实反映模型安全水位、有效规避风险的评估体系。

kafka6courier的博客 661

C语言关键字 restrict(一)

概念:   restrict,C语言中的一种类型限定符(Type Qualifiers),用于告诉编译器,对象已经被指针所引用,不能通过除该指针外所有其他直接或间接的方式修改该对象的内容。 渊源:   restrict是c99标准引入的,它只可以用于限定和约束指针,并表明指针是访问一个数据对象的唯一且初始的方式.即它告诉编译器,所有修改该指针所指向内存中内容的操作都必须通过该指针来修改,而不...

qq_28090573的博客 6160

Kali Linux实战:Aircrack-ng破解Wi-Fi密码的完整流程与常见问题解决

本文详细介绍了在Kali Linux中使用Aircrack-ng套件进行Wi-Fi密码破解的完整流程,包括环境准备、无线网卡配置、网络扫描、握手包捕获与字典破解等关键步骤。同时针对无线网卡不支持监听模式、无法捕获握手包等常见问题提供了实用解决方案,帮助安全研究人员有效评估无线网络安全性。

weixin_29323049的博客 296

比亚迪璇玑架构:10ms级响应引领智能驾驶革命

比亚迪璇玑架构通过三大创新,实现10ms级控制响应时延,使AEB刹车距离比竞品缩短20米。

百态·数智思维 | 聚焦大数据、量化与未来AI 1255

restrict关键字用法

<br />看了下网上的相关贴子,但还是问题解决的不够。下面是相关一个文章,我将在后面再加相关说明:<br />那么restrict的意义是什么呢?<br /><br />概括的说,关键字restrict只用于限定指针;该关键字用于告知编译器,所有修改该指针所指向内容的操作全部都是基于(base on)该指针的,即不存在其它进行修改操作的途径;这样的后果是帮助编译器进行更好的代码优化,生成更有效率的汇编代码。<br /><br />举个简单的例子<br /><br />int foo (int* x, in

654

微波无源器件 功分器1 新型方波导双模无功功分器

本名证明了一种基于有着特定功能的(dedicated)T性匹配元件(散射件)的进化结点的新型波导双模两路功分器的可行性。这个散射件,有着面向三个部分的匹配部分,提供了等效功分并且朝着对应的输出端口传输矩形波导的两个TE10/TE01正交模式。所提出的设计紧凑,易于比例变化并且能够级联来获得。

qq_45245770的博客 1390

浅谈C语言的restrict关键字

restrict关键字用于告诉编译器,对象已经被指针所引用,不能通过除该指针外所有其他直接或间接的方式修改该对象的内容(并非强制性的规定,即用了其他指针访问该内存空间也不会报错)。注意,这是一个C语言的优化关键字,开发者需要自己在编码的时候注意只能使用该指针访问特定的内存空间,并且多个指针指向的空间也不能重叠,以便于编译器后期的优化。使用该关键字时一定要额外小心,不然会出现意想不到的BUG。 以下源码编译为汇编代码的时候使用了海思3519AV100的编译链arm-himix200-lin...

君文 2414

手机VPN的连接方法分享

6、返回到VPN页面,可以看到刚刚新添加的VPN,点击开启VPN后面的开关。5、在打开的添加VPN的页面中输入VPN的信息后点击右上角的“保存”按钮。7、待VPN开关开启后,可以看到添加的VPN正在连接的提示信息了。2、在打开的小米手机设置页面中点击“更多连接方式”的菜单项。3、然后在打开的更多连接方式页面中点击VPN的菜单项。4、在打开的VPN设置页面中点击“添加VPN”的按钮。1、首先在手机屏幕左右的滑动,找到手机的设置图标。

惠惠软件 3万+

LLM评测框架Ragas:测试RAG的性能出现TimeoutError()的解决办法(Ragas+langchain+ollama)

无奈之下,自己找到了一个解决办法,在ragas支持的llm类库中加了一个如下的类,支持ollama、langchian_ollama使用ragas测试报错的问题。可以将如上的库放到你的ragas的系统库的llms目录下,然后修改__init__.py如下。最近用ragas测试rag的性能,发现老出现TimeoutError()的错误。这是一个临时的解决办法,具体等待官方给出最终的解决方案。后来发现官方也没有尽快支持的计划。然后就可以用如下代码进行一些验证。

Criss@陈磊 665

C语言中关键字restrict

restrict,C语言中的一种类型限定符(Type Qualifiers),用于告诉编译器,对象已经被指针所引用,不能通过除该指针外所有其他直接或间接的方式修改该对象的内容。 restrict主要是c语言里用来做优化的关键字 #include <stdio.h> int foo(int *a, int *b) { *a = 1; *b = 6; return *a + *b; } int rfoo(int *restrict a, int *restri.

小吕的博客 1415

conda install出现CondaValueError: Malformed version string invalid character(s)解决方案

本文主要介绍了conda install出现Solving environment:failed、CondaValueError: Malformed version string invalid character(s),希望能对新手有所帮助。 文章目录 1. 问题描述 2. 解决方案 2.1 步骤一 2.2 步骤二 2.3 步骤三

weixin_43178406的博客 6万+

C语言关键字restrict是什么意思?怎样使用

关键字,意思是说在这个指针所指向的内存区域内,程序中不会有其他指针来访问这块区域。这告诉编译器在优化时可以假设这个内存区域的内容不会被其他指针修改,从而进行更高效的优化。分别指向不同的内存区域,并且这些内存区域在该函数中不会重叠。这样,编译器可以对这些内存区域进行更优化的处理,因为它可以假设这些区域不会相互干扰。是一个关键字,用于指示编译器某个指针是唯一的,编译器可以利用这个信息来进行优化。,你可以帮助编译器生成更高效的代码,但要确保对它的语义有清晰的理解,避免引入潜在的错误。

专注音频,高效工作,快乐生活! 1087

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

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(voi

liangar的专栏 1130

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C语言中restrict关键字学习

简介: restrict是c99标准引入的,它只可以用于限定和约束指针,并表明指针是访问一个数据对象的唯一且初始的方式.即它告诉编译器,所有修改该指针所指向内存中内容的操作都必须通过该指针来修改,而不能通过其它途径(其它变量或指针)来修改;这样做的好处是,能帮助编译器进行更好的优化代码,生成更有效率的汇编代码.如 int *restrict ptr, ptr 指向的内存单元只能被 ptr 访

大米粒ing 6069

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

请描述C语言中关键字的作用,C语言关键字RESTRICT介绍

C语言关键字RESTRICT介绍学习C语言也有好长时间了,相信大家在学习C语言的过程中也都有所收获,不过,也应该遇到了许多问题。今天小编在这里就帮同学们介绍一下怎么了解restrict这个词。要理解 restrict,先要知道什么是 Pointer aliasing。Pointer aliasing 是指两个或以上的指针指向同一数据,例如int i = 0;int *a = &i;int ...

weixin_39942335的博客 233

C语言volatile和restrict关键字

volatile和restrict关键字是C语言中一对功能相反的关键字,volatile是禁止编译器优化修饰的变量,restrict是只能使用该关键字优化的指针变量。 volatile关键字 由于访问寄存器的速度要快过RAM,所以编译器一般都会作减少存取外部RAM的优化,编译器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。嵌入式系统程序员经常同硬件、中断、RTOS等等打交道,所有这些都要求使用volatile变量。不懂得volatile内容将会带来灾难。比如: .

tecoes的博客 568

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

类型限定词restrict关键字restrict通过允许编译器优化某几种代码增强了计算支持。它只可用于指针,并表明指针是访问一个数据对象的惟一且初始的方式。为了清楚这样做为何有用,我们需要看一些例子。考虑下面的代码:int ar[10];int * restrict restar = (int *) malloc(10 * sizeof(int));int * par = ar;这里,指针rest...

猫的博客 2029

C 语言restrict 关键字

我们希望某个对象(内存空间)不被修改的通常做法是什么?声明该空间的const类型,但是这样真的可以吗?是不是的,由于const空间对象的指针是可以付给一个非const值指针的。所以这仍然无法不让该空间被修改。 const int a=10; int * b=&a; 虽然,编译器会报警告“ 警告:初始化丢弃了指针目标类型的限定”,这个意思是,b失去了对目标对象的const的限定。但

木易云清 1004

C语言的关键字restrict,C语言中restrict关键字学习

简介:程序员restrict是c99标准引入的,它只能够用于限定和约束指针,并代表指针是访问一个数据对象的惟一且初始的方式.即它告诉编译器,全部修改该指针所指向内存中内容的操做都必须经过该指针来修改,而不能经过其它途径(其它变量或指针)来修改;这样作的好处是,能帮助编译器进行更好的优化代码,生成更有效率的汇编代码.如 int *restrict ptr, ptr 指向的内存单元只能被 ptr 访问...

weixin_39951773的博客 529

C语言关键字 restrict 分析

restrict是c99标准引入的,它只可以用于限定和约束指针,并表明指针是访问一个数据对象的唯一且初始的方式.即它告诉编译器: 所有修改该指针所指向内存中内容的操作都必须通过该指针来修改,而不能通过其它途径(其它变量或指针)来修改; 这样做的好处是,能帮助编译器进行更好的优化代码,生成更有效率的汇编代码. 如 int *restrict ptr, ptr 指向的内存单元只能被 ptr

北冥有鱼的Blog 1135

C语言中restrict的意义,C语言中关键字restrict的概念,使用范围,例子

概念:restrict,C语言中的一种类型限定符(Type Qualifiers),用于告诉编译器,对象已经被指针所引用,不能通过除该指针外所有其他直接或间接的方式修改该对象的内容。渊源:restrict是c99标准引入的,它只可以用于限定和约束指针,并表明指针是访问一个数据对象的唯一且初始的方式.即它告诉编译器,所有修改该指针所指向内存中内容的操作都必须通过该指针来修改,而不能通过其它途径(其它...

weixin_39862697的博客 566

C语言关键字浅析-restrict

### C语言关键字浅析系列 ### ### ISO/ANSI C 关键字 ### restrict是C语言中的一个类型限定词,如果在编程的时候不是很常用C语言指针方面的语法,可能对这个关键字就不是很熟悉 字面上讲,restrict意为“严格的”,我们可以想象为“严格地限定” 其实restrict的出现是为了解决一种叫指针混淆(Pointer aliasing)的问题,并且只用于指针的语法...

Johan_Joe_King的博客 985
上一篇: 贪吃蛇 c++实现
下一篇: C语言main函数参数
熬夜是一种修养
博客等级 码龄9年 12粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值