<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    莊周夢蝶

    生活、程序、未來
       :: 首頁 ::  ::  :: 聚合  :: 管理
        《C Primer Plus》讀到12章,我的C語言復(fù)習(xí)進(jìn)展的挺不錯。這一章介紹存儲類、連接和內(nèi)存管理,可以說是重中之重。
    C的5種存儲類:
    自動——在一個代碼塊內(nèi)(或在一個函數(shù)頭部作為參量)聲明的變量,無論有沒有存儲類修飾符auton,都屬于自動存儲類。該類具有自動存儲時期、代碼塊的作用域和空鏈接(no linkage),如未初始化,它的值是不確定的(java要求局部變量必須初始化)

    寄存器——在一個代碼塊內(nèi)(或在一個函數(shù)頭部作為參量)使用修飾符register聲明的變量屬于寄存器存儲類。該類與自動存儲類相似,具有自動存儲時期、代碼塊作用域和空連接,聲明為register僅僅是一個請求,而非命令,因此變量仍然可能是普通的自動變量,但是仍然無法獲取地址。。如果沒有被初始化,它的值也是未定的。

    靜態(tài)、空鏈接——在一個代碼塊內(nèi)使用存儲類修飾符static聲明的局部變量屬于靜態(tài)空連接存儲類。該類具有靜態(tài)存儲時期、代碼塊作用域和空鏈接,僅在編譯時初始化一次。如未明確初始化,它的字節(jié)將被設(shè)定為0.

    靜態(tài)、外部鏈接——在所有函數(shù)外部定義、未使用static修飾的變量屬于靜態(tài)、外部鏈接存儲類。改類具有靜態(tài)存儲時期、文件作用域和外部鏈接,僅在編譯時初始化一次。如未明確初始化,它的字節(jié)也被設(shè)定為0.

    靜態(tài)、內(nèi)部鏈接——與靜態(tài)、外部鏈接存儲類不同的是,它使用static聲明,也定義在所有函數(shù)外部,但是具有內(nèi)部鏈接(僅能被與它在同一個文件的函數(shù)使用),僅在編譯時初始化一次。如未明確初始化,它的字節(jié)也被設(shè)定為0.

    兩個關(guān)鍵字:volatile和restrict,兩者都是為了方便編譯器的優(yōu)化。

    volatile告訴編譯器該被變量除了可被程序修改意外還可能被其他代理修改,因此,當(dāng)要求使用volatile 聲明的變量的值的時候,系統(tǒng)總是重新從它所在的內(nèi)存讀取數(shù)據(jù),而不是使用寄存器中的緩存。比如
    val1=x;
    val2=x;
    如果沒有聲明volatile,系統(tǒng)在給val2賦值的時候可能直接從寄存器讀取x(假定聰明的編譯器優(yōu)化了),而不是從內(nèi)存的初始位置,那么在兩次賦值之間,x完全有可能被被某些編譯器未知的因素更改(比如:操作系統(tǒng)、硬件或者其它線程等)。如果聲明為volatile,編譯器將不使用緩存,而是每次都從內(nèi)存重新讀取x。

    而restrict是c99引入的,它只可以用于限定指針,并表明指針是訪問一個數(shù)據(jù)對象的唯一且初始的方式,考慮下面的例子:
    int ar[10];
    int * restrict restar=(int *)malloc(10*sizeof(int));
    int *par=ar;

    這里說明restar是訪問由malloc()分配的內(nèi)存的唯一且初始的方式。par就不是了。
    那么:
    for(n=0;n<10;n++)
    {
       par[n]+=5;
       restar[n]+=5;
       ar[n]*=2;
       par[n]+=3;
       restar[n]+=3;
    }
    因為restar是訪問分配的內(nèi)存的唯一且初始的方式,那么編譯器可以將上述對restar的操作進(jìn)行優(yōu)化:
       restar[n]+=8;

    而par并不是訪問數(shù)組ar的唯一方式,因此并不能進(jìn)行下面的優(yōu)化:
       par[n]+=8;
    因為在par[n]+=3前,ar[n]*=2進(jìn)行了改變。使用了關(guān)鍵字restric,編譯器就可以放心地進(jìn)行優(yōu)化了。這個關(guān)鍵字據(jù)說來源于古老的FORTRAN。有興趣的看看這個。


    評論

    # re: C語言的5種存儲類以及關(guān)鍵字volatile、restrict[未登錄]  回復(fù)  更多評論   

    2008-03-15 01:19 by kevin
    寫的 不錯,上面的也都舉例就好了..
    主站蜘蛛池模板: 999在线视频精品免费播放观看| 国产精品成人啪精品视频免费 | 日韩在线观看免费完整版视频| 免费观看黄网站在线播放| 亚洲成aⅴ人片在线观| 1024免费福利永久观看网站| 亚洲剧情在线观看| 免费观看的av毛片的网站| 亚洲乱码国产乱码精华| 国产成人aaa在线视频免费观看| 美女隐私免费视频看| 亚洲精品和日本精品| 两个人看的www免费视频中文| 亚洲Av永久无码精品三区在线| 无码A级毛片免费视频内谢| 亚洲综合图片小说区热久久| 国产麻豆视频免费观看| 亚洲国产精品无码久久| 久久影院亚洲一区| 18女人腿打开无遮掩免费| 亚洲人成77777在线播放网站不卡| 精品国产免费观看一区| 一本久久A久久免费精品不卡| 人人狠狠综合久久亚洲婷婷| 18禁男女爽爽爽午夜网站免费| 亚洲中文字幕一区精品自拍| avtt亚洲天堂| 国产精品99久久免费观看| 国产精品高清视亚洲一区二区| 免费一级大黄特色大片| 国产午夜无码精品免费看| 亚洲伊人久久大香线蕉啊| 免费人成年轻人电影| 国产精品99久久免费观看| 亚洲人成未满十八禁网站| 亚洲午夜未满十八勿入网站2| 国产精品久久免费| www免费黄色网| 33333在线亚洲| 最新亚洲成av人免费看| 国产成人A在线观看视频免费|