类型限定词volatile

本文详细解释了C语言中的限定词volatile和restrict的作用与用法。volatile用于指示变量可能被外部代理更改,常用于硬件地址或共享数据。restrict则用于指明指针是访问数据的唯一途径,帮助编译器优化代码。

一、类型限定词volatile
限定词volatile告诉编译器该变量除了可以被程序改变以外还可被其他代理改变。
它通常被用于硬件地址和与其它并行运行的程序共享的数据。
如:

volatile int locl;
volatile int *ploc;

你可能会奇怪为什么ANSI觉得有必要把volatile作为一个关键字。
原因是它可以方便编译器优化。
例如

val1 = x;
/* 一些不使用x的代码 */
val2 = x;

一个聪明的编译器可能注意到你使用了两次x,而没有改变它的值。那么,它有可能把x临时存储在一个寄存器中。
接着,当val2需要x时,可以通过从寄存器而非初始的内存位置中读取该值以节省时间。
这个过程被称为缓存(caching)。
通常,缓存是一个好的优化方式,但是如果在两个语句间其他代理改变了x的话就不是这样了。
如果没有规定volatile关键字,那么编译器将无从得知这种改变是否可能发生。
在ANSI中,如果声明中没有volatile关键字,那么编译器就可以假定一个值在使用过程中没有被修改,它就可以试着优

化代码。
一个值可以同时是const 和 volatile。
例如,硬件时钟一般设定为不能由程序改变,这一点使它成为const;
但它被程序以外的代理改变,这使它成为volatile.
那么我们可以这么声明:

volatile const int loc;
const volatile int *ploc;

二、类型限定词restrict
关键字restrict用来消除数据间的相关性,编译器从而可以安排语句的并行执行。
它只可以用于指针,并表明指针是访问一个数据对象的唯一且初始的方式。
我们通过一个例子来看看:

int ar[10];
int * par = ar;
int * restrict restar = (int *)malloc (10 * sizeof (int));

注意,指针restar是访问由malloc ()分配的内存的唯一且初始的方式。
因此,它可以由关键字restrict限定。
而指针par既不是初始的,也不是访问数组ar中数据的唯一方式,因此不可以把它限定为restrict。
考虑下面的语句:

for (n = 0; n < 10; n++)
{
    
par[n] += 5;
    
restar[n] += 5;
    
ar[n] *= 2;
    
par[n] += 3;
    
restar[n] += 3;
}

知道了restar是放问它所指向数据块的唯一初始化方式,编译器就可以用具有同样效果的一条语句来代替包含restar的

两个语句。

resatr [n] += 8;

然而,编译器将两个包含par的语句精简为一个语句将导致计算错误。

par[n] +=8;

原因是ar[n] *= 2;这条语句在par[n] += 3之前已经改变了par指针所指向数据的值。

restrict的作用:帮助编译器确定使指针进行数值计算时,是否可以进行优化。
可以将关键字restrict作为指针型函数参量的限定词使用。
这意味着编译器可以假定在函数体内没有其它标识符修改指针指向的数据,因而可以试着优化代码,反之则不然。

voie * memcpy (void * restrict s1, const void * restrict s2, size_t n);

关键字restrict有两个读者。
一个是编译器,它告诉编译器可以自由地去做一些有关优化的假定。
一个是用于,它告诉用户仅使用满足restrict要求的参数。

学生社团系统-学生社团“一站式”运营管理平台-学生社团管理系统-基于SSM的学生社团管理系统-springboot学生社团管理系统.zip-Java学生社团管理系统开发实战-源码 更多学生社团系统: SpringBoot+Vue学生社团“一站式”运营管理平台源码(活动管理+成员考核+经费审批) Java学生社团管理系统开发实战:SSM升级SpringBoot(招新报名+场地预约+数据看板) 基于SpringSecurity的社团管理APP(移动端签到+权限分级+消息推送) 企业级社团数字化平台解决方案(SpringBoot+Redis缓存+Elasticsearch活动搜索) 微信小程序社团服务系统开发(活动直播+社团文化墙+成员互动社区) SpringBoot社团核心源码(多角色支持+工作流引擎+API接口开放) AI赋能社团管理:智能匹配兴趣标签+活动热度预测+成员贡献度分析(附代码) 响应式社团管理平台开发(PC/移动端适配+暗黑模式+无障碍访问) 完整学生社团系统源码下载(SpringBoot3+Vue3+MySQL8+Docker部署) 高校垂直领域社团平台:百团大战系统+社团星级评定+跨校活动联盟 适用对象:本代码学习资料适用于计算机、电子信息工程、数学等专业正在做毕设的学生,需要项目实战练习的学习者,也适用于课程设计、期末大作业。 技术栈:前端是vue,后端是springboot,项目代码都经过严格调试,代码没有任何bug! 核心管理:社团注册、成员管理、权限分级 活动运营:活动发布、报名签到、场地预约 资源服务:经费申请、物资管理、文档共享 数据分析:成员活跃度、活动效果评估、社团影响力排名
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值