• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            朗朗空間

            我知道并不是 所有鳥兒都飛翔

              C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
              16 Posts :: 0 Stories :: 6 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(1)

            我參與的團隊

            搜索

            •  

            最新隨筆

            最新評論

            閱讀排行榜

            評論排行榜

            一、類型限定詞volatile
            限定詞volatile告訴編譯器該變量除了可以被程序改變以外還可被其他代理改變。
            它通常被用于硬件地址和與其它并行運行的程序共享的數據。
            如:

            volatile int locl;
            volatile int *ploc;

            你可能會奇怪為什么ANSI覺得有必要把volatile作為一個關鍵字。
            原因是它可以方便編譯器優化。
            例如

            val1 = x;
            /* 一些不使用x的代碼 */
            val2 = x;

            一個聰明的編譯器可能注意到你使用了兩次x,而沒有改變它的值。那么,它有可能把x臨時存儲在一個寄存器中。
            接著,當val2需要x時,可以通過從寄存器而非初始的內存位置中讀取該值以節省時間。
            這個過程被稱為緩存(caching)。
            通常,緩存是一個好的優化方式,但是如果在兩個語句間其他代理改變了x的話就不是這樣了。
            如果沒有規定volatile關鍵字,那么編譯器將無從得知這種改變是否可能發生。
            在ANSI中,如果聲明中沒有volatile關鍵字,那么編譯器就可以假定一個值在使用過程中沒有被修改,它就可以試著優

            化代碼。
            一個值可以同時是const 和 volatile。
            例如,硬件時鐘一般設定為不能由程序改變,這一點使它成為const;
            但它被程序以外的代理改變,這使它成為volatile.
            那么我們可以這么聲明:

            volatile const int loc;
            const volatile int *ploc;

            二、類型限定詞restrict
            關鍵字restrict用來消除數據間的相關性,編譯器從而可以安排語句的并行執行。
            它只可以用于指針,并表明指針是訪問一個數據對象的唯一且初始的方式。
            我們通過一個例子來看看:

            int ar[10];
            int * par = ar;
            int * restrict restar = (int *)malloc (10 * sizeof (int));

            注意,指針restar是訪問由malloc ()分配的內存的唯一且初始的方式。
            因此,它可以由關鍵字restrict限定。
            而指針par既不是初始的,也不是訪問數組ar中數據的唯一方式,因此不可以把它限定為restrict。
            考慮下面的語句:

            for (n = 0; n < 10; n++)
            {
                
            par[n] += 5;
                
            restar[n] += 5;
                
            ar[n] *= 2;
                
            par[n] += 3;
                
            restar[n] += 3;
            }

            知道了restar是放問它所指向數據塊的唯一初始化方式,編譯器就可以用具有同樣效果的一條語句來代替包含restar的

            兩個語句。

            resatr [n] += 8;

            然而,編譯器將兩個包含par的語句精簡為一個語句將導致計算錯誤。

            par[n] +=8;

            原因是ar[n] *= 2;這條語句在par[n] += 3之前已經改變了par指針所指向數據的值。

            restrict的作用:幫助編譯器確定使指針進行數值計算時,是否可以進行優化。
            可以將關鍵字restrict作為指針型函數參量的限定詞使用。
            這意味著編譯器可以假定在函數體內沒有其它標識符修改指針指向的數據,因而可以試著優化代碼,反之則不然。

            voie * memcpy (void * restrict s1, const void * restrict s2, size_t n);

            關鍵字restrict有兩個讀者。
            一個是編譯器,它告訴編譯器可以自由地去做一些有關優化的假定。
            一個是用于,它告訴用戶僅使用滿足restrict要求的參數。

            posted on 2008-05-12 11:12 聶元朗 閱讀(571) 評論(0)  編輯 收藏 引用 所屬分類: C語言學習筆記
            91久久精品无码一区二区毛片| 中文字幕久久欲求不满| 国产精品99精品久久免费| 国产精久久一区二区三区| 亚洲精品乱码久久久久久| 久久无码精品一区二区三区| 久久精品天天中文字幕人妻 | 伊人久久综合无码成人网| 久久精品国产99国产精品| 99久久国产综合精品网成人影院| 久久久久99精品成人片三人毛片 | 国产精品免费福利久久| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 婷婷久久综合九色综合98| 久久久久亚洲精品天堂| 色婷婷噜噜久久国产精品12p| 无码人妻精品一区二区三区久久久| 国产高清国内精品福利99久久| 亚洲国产精品无码久久久蜜芽| 婷婷久久综合九色综合九七| 国产精品内射久久久久欢欢| 国产精品久久久久9999| 欧美综合天天夜夜久久| 亚洲AV成人无码久久精品老人| 久久免费观看视频| 久久国产香蕉一区精品| 国产亚洲成人久久| 亚洲一区精品伊人久久伊人| 久久人人爽人人人人爽AV| 欧美黑人又粗又大久久久| 久久亚洲AV成人出白浆无码国产| 亚洲欧美成人久久综合中文网 | 精品久久久久久无码不卡| 亚洲国产精品无码成人片久久| 伊人久久大香线蕉无码麻豆| 合区精品久久久中文字幕一区| 久久九九久精品国产| 午夜福利91久久福利| 波多野结衣久久一区二区| 久久久久久国产精品美女| 性高湖久久久久久久久|