restrict关键字

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

转自: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"


Python实现飞书机器人定时发送文本、图片等群消息 python实现飞书群自动发送告警消息 阅读详情

相关推荐

Dell Precision 7920 Tower开机点不亮?别慌,看电源灯闪烁密码快速定位故障(附BIOS恢复指南)

本文详细解析了Dell Precision 7920 Tower工作站开机点不亮时的电源灯闪烁密码,帮助用户快速定位故障。从内存问题到BIOS恢复,再到CPU配置错误,提供了全面的诊断和修复指南,并附有实用的维护建议和工具推荐。

weixin_30892037的博客 482

C - 关键字 - restrict

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

qazw9600的专栏 4377

Silvaco Athena实战:从零搭建MOSFET工艺仿真流程(附mos1ex03完整代码解析)

本文详细介绍了使用Silvaco Athena从零搭建MOSFET工艺仿真的全流程,包括环境配置、核心工艺步骤、器件成型及参数提取等关键环节。通过mos1ex03案例的完整代码解析,帮助读者掌握网格划分、氧化层生长、离子注入等实战技巧,提升半导体工艺仿真能力。

weixin_42648844的博客 406

restrict关键

http://bdxnote.blog.163.com/blog/static/84442352010017185053/ restrict关键字的含义是:约束、限定、严格的; 这个关键字是C99标准中新增加的; 简单地说,restrict关键字只用于限定和约束指针;它告诉编译器,所有修改该指针所指向内存中内容的操作,全都必须基于(base on)该指针,即:不存在...

weixin_34126215的博客 388

基于轻量级神经网络MobileNet V2的水果识别种类算法研究

本文阐述了一种基于轻量级卷积神经网络MobileNet V2的水果分类与识别算法研究。为了最大限度地促进机械收获,需要一个检测系统,它可以让我们识别不同类别的水果。一个相对未开发的想法是使用深度学习和人工智能算法,不仅可以检测水果的种类,还可以检测水果是否成熟。这可以证明是有利可图的,因为它可以提供作物生长状况以及成熟和未成熟果实的个体数量,以及决定是否是收获时间的有用信息。第一步对数据进行了预处理,数据预处理技术在众多的深度学习计算中起到了重要作用。

qq_43556680的博客 1640

大麦网抢票协议逆向分析:从Web安全到高并发风控实战

在当今高并发Web应用场景下,理解网络协议交互与反爬虫机制是后端开发和系统架构设计的核心技能。其基本原理涉及客户端与服务器之间通过HTTP/HTTPS协议进行数据交换,关键环节包括请求参数构造、身份认证与会话管理。这一技术的核心价值在于保障系统安全与公平性,通过动态令牌、签名算法及设备指纹等多重手段,有效抵御自动化脚本攻击。典型应用场景包括票务系统、电商秒杀等需要严格管控资源访问的高并发业务。本文以热门票务平台为例,深入剖析其**请求链与令牌体系**及**行为生物特征分析**等风控策略,通过实战演示协议逆向

weixin_34354173的博客 451

关键字_restrict

本篇博客谈论C语言关键字restrict,只用于修饰指针,功能是帮助编译器进行优化!

仰望星空 1万+

【视频编码学习】AVS3参考软件HPM-4.1简单配置运行

1、用Visual Studio2017打开HPM-4.1文件夹 2、找到文件夹目录下x86_windows文件夹,因为是在win上运行该代码 3、然后找到对应vs版本(我当时2017版)的解决方案sln文件,双击打开可以看到该解决方案下的全部项目。 4、重新生成解决方案时发现提示sdk版本问题,所以右键点击所有的项目,选择重定向项目,修改一下sdk版本。 ...

谦虚勤奋诚实感恩 3098

C/C++中的restrict关键字

helloworld

sinat_28557957的博客 4413

别再死磕U-Net了!用PyTorch手把手教你搭建ResUnet,搞定医学图像分割(附完整代码)

本文详细介绍了如何利用PyTorch搭建ResUnet模型,通过引入残差连接解决医学图像分割中的梯度消失、特征退化和细节丢失问题。与传统U-Net相比,ResUnet在Dice系数和收敛速度上均有显著提升,特别适合处理脑部MRI等复杂医学图像。文章还提供了完整的代码实现和关键训练技巧,帮助开发者快速掌握这一先进技术。

weixin_42552637的博客 326

Camera Sensor接口协议全解析(六)聚焦onsemi HiSPi接口的技术突破与应用实践

摘要: Onsemi HiSPi是一种高速并行接口协议,专为高分辨率图像传感器设计,具备1600 Mbps传输速率、低功耗和高兼容性特点。通过对比DVP、MIPI CSI-2等主流协议,HiSPi在工业/医疗领域表现突出,支持动态功耗控制、多ROI和CRC校验。其创新架构包含多PHY设计,提供分组SP、流SP等多种工作模式,满足灵活传输需求。实际应用中,HiSPi在PCB缺陷检测(5μm精度)和液晶面板检测(0.3% Mura检出率)等场景展现卓越性能,成为高速成像领域的关键技术。

GateWorld的博客 1434

restrict关键字用法

c99中新增加了一个类型定义,就是restrict。

Joe's Blog 1万+

《C++等级认证CCF-GESP真题解析》专栏总目录

❤️ 专栏名称:《C++等级认证CCF-GESP真题解析》🌸 专栏介绍:中国计算机学会GESP《CCF编程能力等级认证》C++编程(1~8级)历届真题解析。🚀 订阅专栏:订阅后可阅读专栏内所有真题解析,真题持续更新中,欢迎订阅!

人生就是一个不断学习的过程 6287

浅谈C语言的restrict关键字

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

君文 2414

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

关键字restrict

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

逆水行舟,不进则退 414

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

关于restrict关键字

restrict 关键字在C和C++编程语言中用于指针声明,它是一种编译器优化提示,告诉编译器该指针是访问特定数据的唯一方式。1.正确性:使用 restrict 时,程序员必须确保没有其他指针或引用指向被 restrict 修饰的指针所指向的数据。1.在实际应用中,确保遵守 restrict 的使用规则是非常重要的。2.在多线程环境中,即使使用了 restrict ,也需要确保适当的同步机制,以防止数据竞争。1.优化性能:通过消除内存访问冲突的可能性,编译器可以更有效地安排指令,提高程序的执行速度。

读书 行路 做人 成事 807

[转]Restrict关键字

0 定义 C99中新增加的用于修饰指针的关键字,用于表示该指针所指向的内存,只有通过该指针访问得到(如下ptr指向的内存单元只能通过ptr访问得到)。从而可以让编译器对代码进行优化,生成更有效率的汇编代码。 char *restrict ptr;    1 优化举例 举例1,如下代码(引自参考1),以及翻译成汇编之后的代码。 #include <st...

weixin_33713350的博客 161

C中restrict关键字

关键字restrict只用于限定指针;该关键字用于告知编译器,所有修改该指针所指向内容的操作全部都是基于(base on)该指针的,即不存在其它进行修改操作的途径;这样的后果是帮助编译器进行更好的代码优化,生成更有效率的汇编代码。 下面通例子说明: int func (int* x, int* y) { *x = 0; *y = 1; return *x; } 上面的函数...

chillinght的博客 329

C99中的restrict关键字

今天读APUE,看到某个函数原型的声明:    int stat (  const char * restrict  pathname,struct stat * restrict buf);这里的restrict让我觉得有些疑惑,一查原来是C99中增加的关键字那么restrict的意义是什么呢?One of the new features in the recently app

暗恋的滋味 1万+

C语言关键字 restrict

restrict是c99标准引入的,它只可以用于限定和约束指针,表明指针是访问一个数据对象的唯一方式。即它告诉编译器,所有修改该指针所指向内存中内容的操作都必须通过该指针来修改,而不能通过其它指针来修改;这样做的好处是,能帮助编译器进行更好的优化代码,生成更有效率的汇编代码。 简单来讲就是为了让编译器进行优化。 下面是Danny Kalev给出的解释(http://www.devx

IT Labourer 1214

Restrict关键字

0 定义 C99中新增加的用于修饰指针的关键字,用于表示该指针所指向的内存,只有通过该指针访问得到(如下ptr指向的内存单元只能通过ptr访问得到)。从而可以让编译器对代码进行优化,生成更有效率的汇编代码。 char *restrict ptr; 1 优化举例        举例1,如下代码(引自参考1),以及翻译成汇编之后的代码。 #include #ifdefRES vo

FireBird的专栏 2582
上一篇: 指针越界和SIGSEGV
下一篇: #pragma 预处理指令详解
心若天府
博客等级 码龄15年 37粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值