国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
Const和volatile的使用

volatile的使用

區(qū)分C程序員和嵌入式系統(tǒng)程序員的最基本的問題。搞嵌入式的程序員經(jīng)常同硬件、中斷、RTOS等等打交道,所有這些都要求用到volatile變量。不懂得volatile的內(nèi)容將會帶來災(zāi)難。

有時在編譯代碼如果選用了優(yōu)化級別 -O2 -O3 ,會產(chǎn)生某些問題。例如,可能在爭奪硬件資源而陷入死循環(huán),或者多個進程有些預(yù)想不到的行為。當遇到這些情況,你可能需要把有些變量定義為 volatile。

如果將一個變量定義為 volatile 則相當于告訴編譯器該變量可能隨時被改變,例如被操作系統(tǒng)或硬件所改變。因為帶有限定符 volatile 的變量可以在任何時刻改變,該變量的物理地址可能被頻繁地訪問。這就意味著編譯器不能對這些變量實現(xiàn)優(yōu)化,例如,將變量緩存到寄存器避免訪問內(nèi)存。

相反,如果一個變量未被定義成 volatile,則編譯器認為該變量不能在應(yīng)用程序之外改變。因此編譯器可對這種變量實行優(yōu)化。關(guān)鍵字 volatile也不能濫用,可能會產(chǎn)生錯誤,比如如下例子:

 

C代碼

通過編譯器優(yōu)化后的反匯編

 

int square(volatile int *ptr)
{
return *ptr * *ptr;
}

……

ldr       r1,   [r0]

ldr        r0,   [r0]

mul       r0,   r1,   r0

……

這段代碼的目的是用來返指針*ptr指向值的平方,但是,由于*ptr指向一個volatile型參數(shù),編譯器優(yōu)化代碼后將產(chǎn)生上表右邊的代碼。

由于*ptr的值可能被意想不到地該變,因此[r0]內(nèi)存單元內(nèi)的值可能是不同的。結(jié)果,這段代碼可能返不是你所期望的平方值!

正確的代碼應(yīng)該如下:

 

C代碼

通過編譯器優(yōu)化后的反匯編

 

int square(int  *ptr)
{
return *ptr * *ptr;
}

……

ldr       r1,   [r0]

mul       r0,   r1,   r1

……

當一個變量的值可能在應(yīng)用程序不知道的情況下可能改變其值,為了避免優(yōu)化帶來的問題,需要將其定義為 volatile 類型。當有以下情況時需要定義為 volatile 類型的變量:

l  訪問內(nèi)存映射的外圍設(shè)備。

l  在不同的進程之間共用全局變量。

l  在中斷服務(wù)程序中訪問全局變量。

const的使用

const int a;
int const a;
const int *a;
int * const a;
int const * a const;

前兩個的作用是一樣,a是一個常整型數(shù)。第三個意味著a是一個指向常整型數(shù)的指針(也就是,整型數(shù)是不可修改的,但指針可以)。第四個意思a是一個指向整型數(shù)的常指針(也就是說,指針指向的整型數(shù)是可以修改的,但指針是不可修改的)。最后一個意味著a是一個指向常整型數(shù)的常指針(也就是說,指針指向的整型數(shù)是不可修改的,同時指針也是不可修改的)。

即使不用關(guān)鍵字 const,也還是能很容易寫出功能正確的程序,那么我為什么還要如此看重關(guān)鍵字const呢?原因如下:

l  關(guān)鍵字const的作用是為給讀你代碼的人傳達非常有用的信息,實際上,聲明一個參數(shù)為常量是為了告訴了用戶這個參數(shù)的應(yīng)用目的。

l  通過給優(yōu)化器一些附加的信息,使用關(guān)鍵字const也許能產(chǎn)生更緊湊的代碼。

l  合理地使用關(guān)鍵字const可以使編譯器很自然地保護那些不希望被改變的參數(shù),防止其被無意的代碼修改。簡而言之,這樣可以減少bug的出現(xiàn)。

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
volatile與const學(xué)習筆記
嵌入式程序員應(yīng)知道的基本問題
嵌入式軟件工程師經(jīng)典的面試題
嵌入式研發(fā)工程師面試大全(ANSI CC++知識 )
C++ 基本功: 全面掌握const, volatile 和 mutable關(guān)鍵字
嵌入式Linux系統(tǒng)及如何開發(fā)自己的嵌入式Linux系統(tǒng)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服