0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

关键字volatile是什么?volatile关键字对编译器优化的影响

Dp1040 来源:strongerHuang 2023-11-03 11:47 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

在我的技术交流群里,经常会看到大家讨论一些“奇怪”的问题,其中有好几次我都发现,是他们全局变量“惹的祸”,问题就是全局变量被优化导致的。

可能初学者不太关心编译器优化的功能,但对于经验丰富的工程师来说,掌握代码优化是必备技能。

今天,我们讲述的话题就是关于代码优化中,关键字volatile在优化过程中起到的作用

关键字volatile是什么?

volatile是一个类型修饰符(type specifier)。

volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。

volatile变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。

---来自百度百科

volatile的定义,应该在(读书)学习时都看过无数遍,但我相信绝大部分人都没有深刻理解其中含义

当你真正编程、开发项目之后,你就会进一步理解其中含义。

volatile关键字对编译器优化的影响

我们都知道编译器有优化代码的功能,我们常用的集成开发环境(Keil、 IAR等)都有优化选项。

473fd922-79e1-11ee-939d-92fbcf53809c.jpg

如果不使用关键字 volatile 申明变量,则编译器可能会对变量的访问并生成非预期的代码或删除预期的功能。

1、什么时候使用volatile?

常见使用volatile声明的情况:

访问内存映射外设。

在多个线程之间共享全局变量。

在中断例程或信号处理程序中访问全局变量。

比如,在STM32代码中:


#define __O volatile /*!< Defines 'write only' permissions */#define     __IO    volatile             /*!< Defines 'read / write' permissions */

浏览代码,你会发现,很多地方都使用了“__IO”,也就是volatile.

在跑系统的项目中,线程间共享的全局变量,建议都加上volatile关键字,这一点,很多人没有在意。

2、不用volatile时可能出现的问题

如果未将变量用volatile声明,则编译器会假定其值不能在其定义的范围之外进行修改。

因此,编译器可能会执行不需要的优化。这可以通过多种方式表现出来:

在轮询硬件时,代码可能会陷入循环。

多线程代码可能会表现出奇怪的行为。

优化可能会导致删除实现故意时序延迟的代码。

举个例子,这是我自己写一个延时函数:


void Delay(int Cnt){ int i;

while(Cnt--) { i++; for(i=0; i<10; i++);  }}

你在不同优化等级情况下,延时时间可能会不一样

同样的代码,你在Keil 和 IAR环境下编译出来的延时时间也可能不一样。

当然,更深入的理解就会牵涉到汇编代码,编译之后的汇编代码会比较直观的呈现差异。

本文转载自strongerHuang

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编译器
    +关注

    关注

    1

    文章

    1670

    浏览量

    51088
  • 关键字
    +关注

    关注

    0

    文章

    37

    浏览量

    7174
  • volatile
    +关注

    关注

    0

    文章

    46

    浏览量

    13626

原文标题:全局变量加/不加volatile的影响

文章出处:【微信号:玩点嵌入式,微信公众号:玩点嵌入式】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Temu跨境电商按关键字搜索Temu商品API的应用及接口请求示例

    限于以下几个方面: 用户搜索商品:当用户在Temu平台上输入关键字搜索商品时,API会根据输入的关键字返回与之相关的商品列表,帮助用户快速找到感兴趣的商品。 数据分析与市场调研:商家可以利用该API进行关键词搜索数据的分析,了解
    的头像 发表于 11-29 15:08 117次阅读

    哪些场合会用到volatile关键字?

    ,使用volatile关键字也许能减少代码bug率。 2.寄存单片机开发,寄存添加volatile
    发表于 11-25 08:19

    什么是‍‍volatile

    volatile是一个类型修饰符(type specifier)。 volatile的作用是作为指令关键字,确保本条指令不会因编译器优化
    发表于 11-25 06:36

    天眼查平台关键字搜索企业数据API接口技术指南

    ​ 一、接口概述 天眼查提供的企业搜索API接口,支持通过关键字查询企业工商信息、经营状态等核心数据。该接口采用RESTful架构,返回JSON格式数据。 二、接口认证 调用需使用API密钥认证
    的头像 发表于 11-21 11:48 402次阅读
    天眼查平台<b class='flag-5'>关键字</b>搜索企业数据API接口技术指南

    通过优化代码来提高MCU运行效率

    调用开销。 使用 const 和 volatile 关键字,帮助编译器进行更好的优化。 数据类型选择 使用与MCU字长匹配的数据类型。在32位MCU上,int 和 uint32_t
    发表于 11-12 08:21

    1688平台关键字搜索商品API接口技术实践指南

    /com.alibaba.product/alibaba.product.search/ 必备参数: { "keyword": "手机", // 搜索关键字 "pageNo": 1, // 页码 "pageSize": 20, // 每页数量 "access_token": "xxx" // 认证令牌 } 二、响应
    的头像 发表于 11-11 14:22 268次阅读
    1688平台<b class='flag-5'>关键字</b>搜索商品API接口技术实践指南

    亚马逊平台根据关键字搜索商品API接口

    ​  在电商开发中,集成亚马逊平台的商品搜索功能是常见需求。通过亚马逊的Product Advertising API(PAAPI),开发者可以根据关键字高效检索商品信息。本技术帖将逐步介绍如何调用
    的头像 发表于 11-05 15:00 127次阅读
    亚马逊平台根据<b class='flag-5'>关键字</b>搜索商品API接口

    简单的内联汇编介绍

    __”。 __volatile__或 volatile 是可选的。如果添加了该关键字,则要求编译器对后续括号内添加的汇编程序不进行任何优化
    发表于 10-30 08:04

    蜂鸟自定义指令软件讲解和内联汇编(一)

    ”是 GCC 的关键字,表示进行内联汇编操作,关键字volatile”要求编译器对后续括号内添加的汇编程序不进行任何优化以保持其原状;如果
    发表于 10-24 10:51

    亚马逊 SP-API 深度开发:关键字搜索接口的购物意图挖掘与合规竞品分析

    本文深度解析亚马逊SP-API关键字搜索接口的合规调用与商业应用,涵盖意图识别、竞品分析、性能优化全链路。通过COSMO算法解析用户购物意图,结合合规技术方案提升关键词转化率,助力卖家实现数据驱动决策,安全高效
    的头像 发表于 10-17 14:59 352次阅读

    阿里巴巴开放平台关键字搜索商品接口实战详解:OAuth2.0 认证落地 + 检索效率优化(附避坑代码)

    在 B2B 电商数据对接中,阿里巴巴开放平台的关键字搜索商品接口(alibaba.aliindex.search)是获取批发商品、供应商数据的核心通道。但多数开发者会卡在OAuth2.0 认证断连
    的头像 发表于 09-16 16:26 661次阅读

    阿里巴巴国际站关键字搜索 API 实战:从多条件筛选到商品列表高效获客

    ​​在跨境电商数据采集场景中,通过关键字精准搜索商品列表是基础且核心的需求。本文将聚焦阿里巴巴国际站的关键字搜索接口,详细介绍如何构建多条件搜索请求、处理分页数据、解析商品列表信息,并提供可直接复用的 Python 实现方案,帮助开发者快速搭建稳定高效的商品搜索功能。
    的头像 发表于 08-20 09:22 696次阅读
    阿里巴巴国际站<b class='flag-5'>关键字</b>搜索 API 实战:从多条件筛选到商品列表高效获客

    micro 关键字搜索全覆盖商品,并通过 API 接口提供实时数据

    micro 关键字搜索全覆盖商品”并通过 API 接口提供实时数据
    的头像 发表于 07-13 10:13 698次阅读

    单片机编程关键字volatile

    volatile 修饰的变量是说这变量可能会被意想不到地改变。通常对于程序员而言,单片机 中用的就算常见了volatile 是易变的,不稳定的意思。其实对于很多人来说,根本没见过这个关键字,不 知道
    发表于 04-02 13:47 2次下载

    带你在单片机编程中熟练使用const(可下载)

    为常量、常数等我们一看到 const 关键字马上就想到了常量。这是不精确的,精确来说应该是只读变量其 值在编译时不能被使用,因为编译器编译时不知道其存储的内容那么
    发表于 04-01 14:18 3次下载