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

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

3天內(nèi)不再提示

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

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

初學(xué)的朋友可能不怎么關(guān)心優(yōu)化選項,但對于經(jīng)驗豐富的工程師來說,掌握代碼優(yōu)化是必備技能。

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

一、關(guān)于volatile

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

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

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

---來自百度百科

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

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

二、volatile關(guān)鍵字對編譯器優(yōu)化的影響

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

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

1.何時使用volatile?

常見使用volatile聲明的情況:

訪問內(nèi)存映射外設(shè)。

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

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

比如,在STM32代碼中:

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

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

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

2.不使用volatile時可能出現(xiàn)的問題

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

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

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

多線程代碼可能會表現(xiàn)出奇怪的行為。

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


舉例:

自己寫一個延時函數(shù):

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

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

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

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

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

    關(guān)注

    30

    文章

    4788

    瀏覽量

    68611
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1634

    瀏覽量

    49130
  • volatile
    +關(guān)注

    關(guān)注

    0

    文章

    45

    瀏覽量

    13029
收藏 人收藏

    評論

    相關(guān)推薦

    Triton編譯器與GPU編程的結(jié)合應(yīng)用

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

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

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

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

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

    Triton編譯器的優(yōu)勢與劣勢分析

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

    Triton編譯器在機器學(xué)習中的應(yīng)用

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

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

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

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

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

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

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

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

    電子發(fā)燒友網(wǎng)站提供《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 ?556次閱讀
    Keil<b class='flag-5'>編譯器</b><b class='flag-5'>優(yōu)化</b>方法

    C語言關(guān)鍵字--typedef

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

    人工智能編譯器與傳統(tǒng)編譯器的區(qū)別

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

    快速掌握C語言關(guān)鍵字

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

    Meta發(fā)布基于Code Llama的LLM編譯器

    近日,科技巨頭Meta在其X平臺上正式宣布推出了一款革命性的LLM編譯器,這一模型家族基于Meta Code Llama構(gòu)建,并融合了先進的代碼優(yōu)化編譯器功能。LLM編譯器的推出,標
    的頭像 發(fā)表于 06-29 17:54 ?1507次閱讀

    SEGGER編譯器優(yōu)化和安全技術(shù)介紹 支持最新C和C++語言

    SEGGER編譯器是專門為ARM和RISC-V微控制設(shè)計的優(yōu)化C/C++編譯器。它建立在強大的Clang前端上,支持最新的C和C++語言功能。 除其他外,其主要功能包括: 1)?尺寸
    的頭像 發(fā)表于 06-04 15:31 ?1465次閱讀
    SEGGER<b class='flag-5'>編譯器</b><b class='flag-5'>優(yōu)化</b>和安全技術(shù)介紹 支持最新C和C++語言