精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

編譯器通常會怎么去處理使用volatile修飾的變量呢?

lilihe92 ? 來源:最后一個bug ? 2023-11-29 10:05 ? 次閱讀

正文

嵌入式軟件開發過程中,如果對volatile不熟,那可以你應該是個"假嵌入式程序員",因為一個變量需不需要使用volatile考慮的場景挺多的,如果在某些場景下亂用,會影響程序運行效率,有時候忘記加甚至會使得程序發生異常,那么bug菌今天就大家好好聊聊這個C語言關鍵字:

1

傳統定義

volatile直譯為“易變的”,也就是告訴編譯器這個變量隨時都可能發生變化,編譯器你跟我“特殊照顧一下“。

那么編譯器通常會怎么去處理使用volatile修飾的變量呢?

對于C變量都是代表著對應的內存,讀取使用volatile修飾的變量,會直接從其所對應的內存地址中獲取最新的數據,否則,編譯器會對其訪問進行優化,比如直接從緩存中讀取副本、或者是從寄存器中讀取副本。

這樣就可能會導致數據更新不一致的問題。

2

最常用的地方

從前面對volatile的功能描述,我們可以知道volatile最常用于那些與硬件外設寄存器打交道的地址,這樣確保每次對寄存器的讀取都是從內存中獲取的最新值,比如:

2f457242-8df4-11ee-939d-92fbcf53809c.png

再比如下圖所示,如果我們向地址0x812100地址連續改變其值:

2f58b3ac-8df4-11ee-939d-92fbcf53809c.png

那么編譯器通常會將其直接優化為第三條操作,并不會去執行前兩條操作,這樣會造成寫寄存器時序上的問題。

如果采用volatile去修飾,則三條命令便會依次執行,達到我們代碼所示三次操作的目的。

2f62bf46-8df4-11ee-939d-92fbcf53809c.png

3

更復雜一點的,也是最重要的

其實對于volatile所解決的問題用更加專業的說法可以分為:可見性和有序性。

1、可見性

所謂可見性,通常是在多線程訪問共享數據的情況,當一個線程對共享變量進行修改,而其他線程能否立即觀察到這個修改的性質。

在我們目前大部分單核一級緩存的CPU無需考慮這個問題,而對于現場多核多級緩存處理器,各個現場都會維護著自己的緩存,如果僅僅只是更新到了自己的緩存中那么其他線程是無法立馬感受到這個修改的,最終導致結果不一致。

2、有序性

很多時候也叫作重排序,說白了就是對執行指令進行了執行順序上的優化,以不改變指令運行的最終結果,而改變指令的執行順序。

編譯器可以調整指令,同樣處理器的多級流水線和亂序執行也同樣可以改變指令執行順序;甚至為了多級緩存的高效執行,也同樣會對內存讀寫操作進行重排序。

然而這樣的重排序,卻會對多線程并發訪問共享數據的過程中產生問題,從而不符合我們編程源碼的預期執行順序。

但對于volatile只能在一定程度上防止指令重排序,其只能保證單個變量訪問的有序性,而不能保證整個程序的有序性,所以這一點是大家尤為要注意的。

所以講了這么多,相信以后大家再開發中也都會遇到。







審核編輯:劉清

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

    關注

    31

    文章

    5250

    瀏覽量

    119192
  • C語言
    +關注

    關注

    180

    文章

    7575

    瀏覽量

    134017
  • 嵌入式軟件
    +關注

    關注

    4

    文章

    238

    瀏覽量

    26550
  • volatile
    +關注

    關注

    0

    文章

    44

    瀏覽量

    12979

原文標題:這個變量要不要用volatile修飾呢?

文章出處:【微信號:最后一個bug,微信公眾號:最后一個bug】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    volatile 釋義

    取出i的值,因而編譯器生成的匯編代碼會重新從內存中i的地址處讀取i的值存放在k中。一句話概括就是,當用volatile關鍵字修飾變量時,優化
    發表于 08-05 16:06

    【原創分享】單片機編程關鍵字之volatile

    ,那么兩個線程有可能一個使用內存中的變量,一個使用寄存中的變量,這回造成程序的錯誤執行。那么用了volatile修飾
    發表于 06-29 11:17

    volatile關鍵字應用場景及示例

    volatile關鍵字1.應用場景2.示例1.應用場景volatile關鍵字分析,往往應用在三種場合1)多線程編程共享全局變量的時候,該全局變量要加上
    發表于 08-24 07:21

    編譯器之位域和volatile研究

    1、位域和volatile介紹  位域和volatile大家再熟悉不過了:前者用于將指定類型的整形變量按照我們的意愿像蛋糕一樣切分成或大或小的若干份;后者用于告訴編譯器“絕不允許對被
    發表于 11-11 18:09

    C語言中的volatile關鍵字

    volatile關鍵字是一種類型修飾符,用它聲明的類型變量表示可以被某些編譯器未知的因素更改。
    發表于 05-27 09:32 ?3245次閱讀

    Volatile與多線程的認識與理解

    不會因編譯器的優化而省略,且要求每次直接讀值。volatile變量是說這變量可能會被意想不到地改變,這樣,編譯器就不會去假設這個
    發表于 12-01 10:31 ?1619次閱讀

    volatile變量定義的意義和該用在哪里

    volatile 影響編譯器編譯的結果,volatile指出 變量是隨時可能發生變化的,與volatil
    發表于 03-07 15:29 ?3612次閱讀
    <b class='flag-5'>volatile</b><b class='flag-5'>變量</b>定義的意義和該用在哪里

    C語言類型修飾Volatile的使用說明

    ,確保本條指令不會因編譯器的優化而省略,且要求每次直接讀值。volatile變量是說這變量可能會被意想不到地改變,這樣,編譯器就不會去假設
    的頭像 發表于 09-19 10:54 ?3457次閱讀

    WIN和AVR及AVR-GCC中如何使用volatile的詳細資料概述

    volatile 的字面含義是易變的,那么將一個變量指示為 volatile是什么意思?是告訴編譯器這個
    發表于 11-20 17:09 ?2次下載
    WIN和AVR及AVR-GCC中如何使用<b class='flag-5'>volatile</b>的詳細資料概述

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

    volatile關鍵字對編譯器優化的影響
    的頭像 發表于 02-28 17:15 ?2824次閱讀

    虛擬機:編譯器對C函數的名字修飾

    虛擬機:編譯器對C函數的名字修飾
    的頭像 發表于 06-22 11:44 ?2475次閱讀
    虛擬機:<b class='flag-5'>編譯器</b>對C函數的名字<b class='flag-5'>修飾</b>

    如何使用C++語法中的volatile

    volatile volatile int i = 10; volatile 關鍵字是一種類型修飾符,用它聲明的類型變量表示可以被某些
    的頭像 發表于 09-09 09:38 ?1396次閱讀

    C++基礎語法之volatile、assert()和sizeof()

    volatile volatile int i = 10; volatile 關鍵字是一種類型修飾符,用它聲明的類型變量表示可以被某些
    的頭像 發表于 09-09 09:48 ?1222次閱讀

    漫談C變量——優化天敵“volatile

    在前面的文章《編譯器玄學報告第一期》中,我們了解到:volatile實際上是告訴編譯器“絕不允許對被修飾變量動手動腳(做優化)”,因為..
    發表于 01-25 18:43 ?0次下載
    漫談C<b class='flag-5'>變量</b>——優化天敵“<b class='flag-5'>volatile</b>”

    一文詳解volatile關鍵字

    volatile 是易變的、不穩定的意思。和const一樣是一種類型修飾符,volatile關鍵字修飾變量
    的頭像 發表于 02-15 11:54 ?960次閱讀
    一文詳解<b class='flag-5'>volatile</b>關鍵字