乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Const和volatile的使用

       昵稱5402009 2011-01-06

      volatile的使用

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

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

      如果將一個(gè)變量定義為 volatile 則相當(dāng)于告訴編譯器該變量可能隨時(shí)被改變,例如被操作系統(tǒng)或硬件所改變。因?yàn)閹в邢薅ǚ?font face="Times New="> volatile 的變量可以在任何時(shí)刻改變,該變量的物理地址可能被頻繁地訪問。這就意味著編譯器不能對(duì)這些變量實(shí)現(xiàn)優(yōu)化,例如,將變量緩存到寄存器避免訪問內(nèi)存。

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

       

      C代碼

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

       

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

      ……

      ldr       r1,   [r0]

      ldr        r0,   [r0]

      mul       r0,   r1,   r0

      ……

      這段代碼的目的是用來(lái)返指針*ptr指向值的平方,但是,由于*ptr指向一個(gè)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

      ……

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

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

      l  在不同的進(jìn)程之間共用全局變量。

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

      const的使用

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

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

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

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

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

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

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多