吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

關于volatile關鍵字對編譯器優化的影響

黃工的嵌入式技術圈 ? 來源:黃工的嵌入式技術圈 ? 作者:黃工的嵌入式技術 ? 2020-02-28 17:15 ? 次閱讀

初學的朋友可能不怎么關心優化選項,但對于經驗豐富的工程師來說,掌握代碼優化是必備技能。

今天講述的話題就是關于代碼優化中,關鍵字volatile在優化過程中起到的作用。

一、關于volatile

volatile是一個類型修飾符(type specifier)。

volatile的作用是作為指令關鍵字,確保本條指令不會因編譯器的優化而省略,且要求每次直接讀值。

volatile變量是說這變量可能會被意想不到地改變,這樣,編譯器就不會去假設這個變量的值了。

---來自百度百科

volatile的定義,應該在讀書時都看過無數遍。但我相信絕大部分人都沒有深刻理解其中含義。

但當你真正編程,開發項目之后,你就會進一步理解其中含義。

二、volatile關鍵字對編譯器優化的影響

我們都知道編譯器有優化代碼的功能,我們常用的集成開發環境(Keil、 IAR)都有優化選項。

如果不使用關鍵字volatile申明變量,則編譯器可能會對變量的訪問并生成非預期的代碼或刪除預期的功能。

1.何時使用volatile?

常見使用volatile聲明的情況:

訪問內存映射外設。

在多個線程之間共享全局變量。

在中斷例程或信號處理程序中訪問全局變量。

比如,在STM32代碼中:

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

瀏覽代碼,你會發現,很多地方都使用了“__IO”,也就是volatile.

在跑系統的項目中,線程間共享的全局變量,建議都加上volatile關鍵字,這一點,很多人沒有在意。

2.不使用volatile時可能出現的問題

如果未將變量用volatile聲明,則編譯器會假定其值不能在其定義的范圍之外進行修改。

因此,編譯器可能會執行不需要的優化。這可以通過多種方式表現出來:

在輪詢硬件時,代碼可能會陷入循環。

多線程代碼可能會表現出奇怪的行為。

優化可能會導致刪除實現故意時序延遲的代碼。


舉例:

自己寫一個延時函數:

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

你在不同優化等級情況下,延時時間可能會不一樣;

同樣的代碼,你在Keil 和 IAR環境下編譯出來的延時時間也可能不一樣。

當然,更深入的理解就會牽涉到匯編代碼,編譯之后的匯編代碼會比較直觀的呈現差異。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 代碼
    +關注

    關注

    30

    文章

    4825

    瀏覽量

    69043
  • 編譯器
    +關注

    關注

    1

    文章

    1642

    瀏覽量

    49283
  • volatile
    +關注

    關注

    0

    文章

    45

    瀏覽量

    13060
收藏 人收藏

    評論

    相關推薦

    什么樣的代碼會被編譯器優化

    現在的編譯器有多智能,可能你辛辛苦苦寫的代碼,在編譯器看來就是幾句廢話,直接被刪除掉。
    的頭像 發表于 01-16 16:38 ?183次閱讀

    Triton編譯器與GPU編程的結合應用

    Triton編譯器簡介 Triton編譯器是一種針對并行計算優化編譯器,它能夠自動將高級語言代碼轉換為針對特定硬件優化的低級代碼。Trit
    的頭像 發表于 12-25 09:13 ?323次閱讀

    Triton編譯器如何提升編程效率

    在現代軟件開發中,編譯器扮演著至關重要的角色。它們不僅將高級語言代碼轉換為機器可執行的代碼,還通過各種優化技術提升程序的性能。Triton 編譯器作為一種先進的編譯器,通過多種方式提升
    的頭像 發表于 12-25 09:12 ?333次閱讀

    Triton編譯器優化技巧

    在現代計算環境中,編譯器的性能對于軟件的運行效率至關重要。Triton 編譯器作為一個先進的編譯器框架,提供了一系列的優化技術,以確保生成的代碼既高效又適應不同的硬件架構。 1. 指令
    的頭像 發表于 12-25 09:09 ?340次閱讀

    Triton編譯器的優勢與劣勢分析

    Triton編譯器作為一種新興的深度學習編譯器,具有一系列顯著的優勢,同時也存在一些潛在的劣勢。以下是對Triton編譯器優勢與劣勢的分析: 優勢 高效性能優化 : Triton
    的頭像 發表于 12-25 09:07 ?385次閱讀

    Triton編譯器在機器學習中的應用

    1. Triton編譯器概述 Triton編譯器是NVIDIA Triton推理服務平臺的一部分,它負責將深度學習模型轉換為優化的格式,以便在NVIDIA GPU上高效運行。Triton編譯器
    的頭像 發表于 12-24 18:13 ?518次閱讀

    Triton編譯器與其他編譯器的比較

    Triton編譯器與其他編譯器的比較主要體現在以下幾個方面: 一、定位與目標 Triton編譯器 : 定位:專注于深度學習中最核心、最耗時的張量運算的優化。 目標:提供一個高度抽象、靈
    的頭像 發表于 12-24 17:25 ?483次閱讀

    Triton編譯器功能介紹 Triton編譯器使用教程

    Triton 是一個開源的編譯器前端,它支持多種編程語言,包括 C、C++、Fortran 和 Ada。Triton 旨在提供一個可擴展和可定制的編譯器框架,允許開發者添加新的編程語言特性和優化技術
    的頭像 發表于 12-24 17:23 ?634次閱讀

    C語言關鍵字分別發生在哪個階段

    的第一個階段:預處理,對一些宏定義做替換。 第二個,const。 C語言中的 const 用于修飾只讀變量,表示變量本身不能修改。 這個關鍵字會在編譯的第二步起作用,也就是編譯。強行修改一個只讀變量,
    的頭像 發表于 11-24 10:31 ?230次閱讀

    C7000優化C/C++編譯器

    電子發燒友網站提供《C7000優化C/C++編譯器.pdf》資料免費下載
    發表于 10-30 09:45 ?0次下載
    C7000<b class='flag-5'>優化</b>C/C++<b class='flag-5'>編譯器</b>

    Keil編譯器優化方法

    我們都知道,代碼是可以通過編譯器優化的,有的時候,為了提高運行速度或者減少代碼尺寸,會開啟優化選項。
    的頭像 發表于 10-23 16:35 ?809次閱讀
    Keil<b class='flag-5'>編譯器</b><b class='flag-5'>優化</b>方法

    C語言關鍵字--typedef

    C語言關鍵字使用方法學習指南!
    的頭像 發表于 10-07 12:44 ?342次閱讀

    人工智能編譯器與傳統編譯器的區別

    人工智能編譯器(AI編譯器)與傳統編譯器在多個方面存在顯著的差異。這些差異主要體現在設計目標、功能特性、優化策略、適用范圍以及技術復雜性等方面。以下是對兩者區別的詳細探討,旨在全面解析
    的頭像 發表于 07-17 18:19 ?2112次閱讀

    快速掌握C語言關鍵字

    C語言中的32個關鍵字你知道多少個呢?根據關鍵字的作用分為四類:數據類型關鍵字、控制語句關鍵字、存儲類型關鍵字和其它
    的頭像 發表于 07-06 08:04 ?419次閱讀
    快速掌握C語言<b class='flag-5'>關鍵字</b>

    SEGGER編譯器優化和安全技術介紹 支持最新C和C++語言

    SEGGER編譯器是專門為ARM和RISC-V微控制設計的優化C/C++編譯器。它建立在強大的Clang前端上,支持最新的C和C++語言功能。 除其他外,其主要功能包括: 1)?尺寸
    的頭像 發表于 06-04 15:31 ?1528次閱讀
    SEGGER<b class='flag-5'>編譯器</b><b class='flag-5'>優化</b>和安全技術介紹 支持最新C和C++語言
    百家乐官网技巧| 闲和庄百家乐官网娱乐网| 网上百家乐官网赌场| 百家乐官网游戏机子| 百家乐官网怎么稳赢| 百家乐玄机| 大发888相关资讯| 成都百家乐的玩法技巧和规则| 百家乐算牌方| 揭秘百家乐百分之50| 大发888最新版本下载| 百家乐官网终端下载| 免费百家乐官网预测软件| 百家乐长龙技巧| 南溪县| 百家乐官网赌场导航| 百家乐搏牌| 温泉县| 怎么玩百家乐官网呀| 木棉百家乐的玩法技巧和规则| 丹阳棋牌游戏中心| 太阳城百家乐官网下载网址| 百家乐有作弊的吗| 778棋牌游戏| 百家乐官网揽法大全| 做生意养猫风水| 大发888娱乐城下| 百家乐官网网站赌钱吗| 百家乐可以出千吗| 绿春县| 乐九百家乐娱乐城| 凌龙棋牌游戏大厅| 赌百家乐官网的玩法技巧和规则| 百家乐已破解的书籍| 宝龙娱乐城官网| 百家乐官网开户投注| 利澳百家乐娱乐城| 百家乐官网投注办法| 百家乐娱乐城赌场| 太阳城娱乐城网站| 百家乐真人视屏游戏|