欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

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

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

3天內不再提示

關鍵字volatile是什么?volatile關鍵字對編譯器優(yōu)化的影響

Dp1040 ? 來源:strongerHuang ? 2023-11-03 11:47 ? 次閱讀

在我的技術交流群里,經常會看到大家討論一些“奇怪”的問題,其中有好幾次我都發(fā)現,是他們全局變量“惹的禍”,問題就是全局變量被優(yōu)化導致的。

可能初學者不太關心編譯器優(yōu)化的功能,但對于經驗豐富的工程師來說,掌握代碼優(yōu)化是必備技能。

今天,我們講述的話題就是關于代碼優(yōu)化中,關鍵字volatile在優(yōu)化過程中起到的作用

關鍵字volatile是什么?

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

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

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

---來自百度百科

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

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

volatile關鍵字對編譯器優(yōu)化的影響

我們都知道編譯器有優(yōu)化代碼的功能,我們常用的集成開發(fā)環(huán)境(Keil、 IAR等)都有優(yōu)化選項。

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

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

1、什么時候使用volatile?

常見使用volatile聲明的情況:

訪問內存映射外設。

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

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

比如,在STM32代碼中:


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

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

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

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

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

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

在輪詢硬件時,代碼可能會陷入循環(huán)。

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

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

舉個例子,這是我自己寫一個延時函數:


void Delay(int Cnt){ int i;

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

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

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

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

本文轉載自strongerHuang

審核編輯:湯梓紅

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

    關注

    1

    文章

    1642

    瀏覽量

    49317
  • 關鍵字
    +關注

    關注

    0

    文章

    37

    瀏覽量

    6928
  • volatile
    +關注

    關注

    0

    文章

    45

    瀏覽量

    13063

原文標題:全局變量加/不加volatile的影響

文章出處:【微信號:玩點嵌入式,微信公眾號:玩點嵌入式】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    淺談SQL優(yōu)化小技巧

    存儲在緩存中的數據; (3)未命中緩存后,MySQL通過關鍵字將SQL語句進行解析,并生成一顆對應的解析樹,MySQL解析將使用MySQL語法進行驗證和解析。 例如,驗證是否使用了錯誤的關鍵字,或者
    的頭像 發(fā)表于 12-25 09:59 ?589次閱讀

    Triton編譯器優(yōu)化技巧

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

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

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

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

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

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

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

    C語言關鍵字分別發(fā)生在哪個階段

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

    C7000優(yōu)化C/C++編譯器

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

    Keil編譯器優(yōu)化方法

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

    C語言關鍵字--typedef

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

    使用邊緣AI和Sitara處理進行關鍵字檢測

    電子發(fā)燒友網站提供《使用邊緣AI和Sitara處理進行關鍵字檢測.pdf》資料免費下載
    發(fā)表于 09-02 11:30 ?0次下載
    使用邊緣AI和Sitara處理<b class='flag-5'>器</b>進行<b class='flag-5'>關鍵字</b>檢測

    快速掌握C語言關鍵字

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

    inline關鍵字優(yōu)化導致此類函數被布局在flash內,怎么處理?

    == 0));} 由于uart.c多處調用這個函數,所以編譯器自作聰明地把它編譯成了非內聯函數(意圖是減少代碼占用?),且elf能找到uart_ll_is_tx_idle標號
    發(fā)表于 06-21 12:03

    IDF4.2.1的編譯器優(yōu)化bug導致panic怎么處理?

    == 0) && (status.st_utx_out == 0));} 它是一個inline函數。我們都認為inline關鍵字,會告訴編譯器內聯此函數,于是它的代碼
    發(fā)表于 06-21 10:55

    簡單總結一下嵌入式C++中常見的錯誤形式

    對于 C++ 類,一些關鍵字只要寫在 .h 中就好,cpp 中就不用再加上了,比如 virtual、static 等關鍵字,如果在 cpp 中多寫,編譯器會報錯。
    的頭像 發(fā)表于 02-23 09:40 ?587次閱讀

    內聯函數定義 為什么需要內聯函數

    inline關鍵字是C99標準的型關鍵字,其作用是將函數展開,把函數的代碼復制到每一個調用處。
    的頭像 發(fā)表于 02-19 12:20 ?605次閱讀