亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

C語言中const,volatile,restrict的用法總結

2020-01-26 15:43:01
字體:
來源:轉載
供稿:網友

1. const

變量聲明中帶有關鍵詞const,意味著不能通過賦值,增量或減量來修改該變量的值,這是顯而易見的一點。指針使用const則要稍微復雜點,因為不得不把讓指針本身成為const和指針指向的值成為const區別開來、下面的聲明表示pf指向的值必須是不變的

constfloat *pf;而pf則是可變的,它可以指向另外一個const或非const值;相反,下面的聲明說明pf是不能改變的,而pf所指向的值則是可以改變的:

float* const pf;

最后,當然可以有既不能改變指針的值也不能改變指針指向的值的值的聲明方式:

constfloat * const pf;

需要注意的是,還有第三種放置const關鍵字的方法:

float const * pf; //等價于constfloat * pf;

總結就是:一個位于*左邊任意位置的const使得數據成為常量,而一個位于*右邊的const使得指針本身成為const

還要注意的一點是關于const在全局數據中的使用:

使用全局變量被認為是一個冒險的方法,它使得數據在程序的任何部分都可以被錯誤地修改,如果數據是const,那么這種擔心就是多余的了不是嘛?因此對全局數據使用const是合理的。

然而,在文件之間共享const數據要格外小心,有兩個策略可以使用。一個是遵循外部變量的慣用規則,在一個文件進行定義聲明,在其他文件進行引用聲明(使用關鍵字extern)。

/*file1.c------定義一些全局常量*/

const double PI = 3.14159;

/*file2.c-----是用在其他文件中定義的全局變量*/

extern const dounle PI;

另外一個方法是把全局變量放在一個include文件里,這時候需要格外注意的是必須使用靜態外部存儲類

/*constant.h----定義一些全局常量*/

static const double PI = 3.14159;

/*file1.c-----使用其他文件定義的全局變量*/

#include”constant.h”。

/*file2.c-----使用其他文件定義的全局變量*/

#include”constant.h”

如果不使用關鍵字static,在文件file1.c和file2.c中包含constant.h將導致每個文件都有同一標識符的定義聲明ANSI標準不支持這樣做(有些編譯器確實支持)。通過使用static, 實際上給了每個文件一個獨立的數據拷貝,如果文件想使用該數據與另外一個文件通話,這樣做就不行了,因為每個文件只能看見他自己的拷貝,然而由于數據是不 可變的,這就不是問題了。使用頭文件的好處是不必惦記在一個文件中進行定義聲明,在另一個文件中進行引用聲明,缺點在于復制了數據,如果常量很大的話,這 就是個問題了。

2. volatile

限定詞volatile告訴編譯器,該變量除了可被程序改變意外還可以被其他代理改變。典型的它用于硬件地址和其他并行運行的程序共享的數據。例如,一個地址中可能保存著當前的時鐘信息。不管程序做些什么,該地址會隨時間改變。另一種情況是一個地址用來接收來自其他計算機的信息;

語法同const:

volatile int a;//a是一個易變的位置

volatile int * pf;//pf指向一個易變的位置

把volatile作為一個關鍵字的原因是它可以方便編譯器優化。

假如有如下代碼:

va= x;

//一些不使用x的代碼

vb= x;

一個聰明的編譯器可能注意到你兩次使用了x,但是沒有改變它的值,它將把x臨時存貯在一個寄存器中,接著,當vb主要x是的時候,它從寄存器而非初始的內存位置得到x的值來節省時間。這個過程被稱為緩存。通常緩存是一個好的優化方式,但是如果兩個語句中間的其他代理改變了x的值的話就不是這樣了。如果沒有規定volatile關鍵字,編譯器將無從得知這種改變是否可能發生,因此,為了安全起見,編譯器不使用緩存。那是在ANSI以前的情形,現在,如果在聲明中沒有使用volatile關鍵字,編譯器就可以假定一個值在使用過程中沒有修改,它就可以試著優化代碼。總而言之,volatile使得每次讀取數據都是直接在內存讀取而不是緩存。

你可能會覺得奇怪,const和volatile可以同時使用,但是確實可以。例如硬件時鐘一般不能由程序改變,這使得他成為const,但他被程序以外的代理改變,這使得他成為volatile,所以你可以同時使用它們,順序是不重要的:

const volatile time;

volatile表明某個變量的值可能在外部被改變,優化器在用到這個變量時必須每次都小心地重新讀取這個變量的值,而不是使用保存在寄存器里的備份。它可以適用于基礎類 型如:int,char,long......也適用于C的結構和C++的類。當對結構或者類對象使用volatile修飾的時候,結構或者類的所有成員 都會被視為volatile.

該關鍵字在多線程環境下經常使用,因為在編寫多線程的程序時,同一個變量可能被多個線程修改,而程序通過該變量同步各個線程。

簡單示例:

復制代碼 代碼如下:

DWORD __stdcall threadFunc(LPVOID signal)
{
int* intSignal=reinterdivt_cast(signal);
*intSignal=2;
while(*intSignal!=1)
sleep(1000);
return 0;
}

該線程啟動時將intSignal 置為2,然后循環等待直到intSignal 為1 時退出。顯然intSignal的值必須在外部被改變,否則該線程不會退出。但是實際運行的時候該線程卻不會退出,即使在外部將它的值改為1,看一下對應的偽匯編代碼就明白了:

mov ax,signal
label:
if(ax!=1)
goto label

對于C編譯器來說,它并不知道這個值會被其他線程修改。自然就把它cache在寄存器里面。C 編譯器是沒有線程概念的,這時候就需要用到volatile。volatile 的本意是指:這個值可能會在當前線程外部被改變。也就是說,我們要在threadFunc中的intSignal前面加上volatile關鍵字,這時 候,編譯器知道該變量的值會在外部改變,因此每次訪問該變量時會重新讀取,所作的循環變為如下面偽碼所示:
label:
mov ax,signal
if(ax!=1)
goto label

注意:一個參數既可以是const同時是volatile,是volatile因為它可能被意想不到地改變。它是const因為程序不應該試圖去修改它。

3.restrict

關鍵字restrict通過允許編譯器優化某幾種代碼增強了計算支持。記住,它只能用于指針,并且表明指針是訪問一個數據對象的唯一且初始的方式。為了清楚為何這樣做,我們需要看一些例子:

復制代碼 代碼如下:

intar[10];

int* restrict restar = (int*)malloc(10*sizeof(int));

int* par = ar;


這里,指針restar是訪問malloc分配的內存的唯一而且初始的方式,因此聲明為restrict。然而,par指針既不是初始的,也不是訪問數組ar中數據的唯一方式,所以不用restrict限定詞。現在考慮下面這個更加復雜的例子,其中n是一個int
復制代碼 代碼如下:

for(n= 0;n < 10;n++)

{

par[n]+= 5;

restar[n]+= 5;

ar[n]*= 2;

par[n]+= 3;

restar[n]+= 3;

}


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

restar[n]+= 8;/*可以替換*/

然而將兩個計算par的語句精簡為一個則會導致錯誤因為在par兩次訪問數據之間,ar改變了該數據的值。沒有關鍵字restrict,編譯器將不得不設想比較糟糕的那一種形式,而使用之后,編譯器可以放心大膽的尋找計算的捷徑。可以將關鍵字作為指針型函數參量的限定詞使用,這意味著編譯器可以假定在函數體內沒有其他標志符修改指針指向的數據,因而可以試著優化代碼,反之不然。來看一下C99標準下C庫中的兩個函數,他們從一個位置把字節復制到另一個位置

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

void*memmove(void* s1,const void * s2,size_t);

memcpy要求兩個指針的位置不能重疊,但memmove沒有這個要求。把s1,s2聲明為restrict意味著每個指針都是相應數據的唯一訪問方式,因此他們不能訪問同一數據塊。這滿足了不能有重疊的要求。

關鍵字restrict有兩個讀者:編譯器,它告訴編譯器可以自由地做一些優化的假定。另一個讀者是用戶,他告訴用戶僅使用滿足restrict要求的參數。一般,編譯器沒法檢查你是否遵循了這一限制,如果你蔑視它,也就是讓自己冒險。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美激情影音先锋| 97视频在线免费观看| 久久久国产精彩视频美女艺术照福利| 久久精品国产2020观看福利| 欧洲成人午夜免费大片| 中文字幕国产精品久久| 国产国语videosex另类| 成人午夜在线影院| 日韩电影大全免费观看2023年上| 国产视频精品xxxx| 2021久久精品国产99国产精品| 草民午夜欧美限制a级福利片| 91中文字幕在线| 国产精品精品一区二区三区午夜版| 国产精品久久久久久久一区探花| 欧美激情精品在线| 国产精品亚洲综合天堂夜夜| 日韩美女写真福利在线观看| 欧美日韩福利在线观看| 欧美性xxxxx极品| 久久久久久久久亚洲| 欧美日韩精品在线视频| 国产精品视频网址| 欧美激情视频网址| 亚洲第一页在线| 久久影视电视剧凤归四时歌| 欧美国产日韩一区二区在线观看| 中文字幕视频一区二区在线有码| 精品国产91久久久久久| 欧美韩国理论所午夜片917电影| 国内精久久久久久久久久人| 91视频免费在线| 亚洲精品成a人在线观看| 亚洲免费视频一区二区| 亚州成人av在线| 亚洲影视九九影院在线观看| 97精品国产91久久久久久| 国产精品第一第二| 欧美激情在线一区| 国产亚洲欧美日韩美女| 国产精品成人观看视频国产奇米| 91理论片午午论夜理片久久| 法国裸体一区二区| 日韩av网站在线| 欧美精品电影免费在线观看| 亚洲国产精品人人爽夜夜爽| 亚洲国产精品久久精品怡红院| 亚洲精选在线观看| 中文字幕视频在线免费欧美日韩综合在线看| 国产精品海角社区在线观看| 777国产偷窥盗摄精品视频| 亚洲成人精品久久久| 国产精品高潮呻吟视频| 日韩成人在线网站| 国产97免费视| 欧美极品少妇全裸体| 97avcom| 欧美国产日本高清在线| 国色天香2019中文字幕在线观看| 国产成人av网| 91精品久久久久久久久久久久久久| 日韩精品有码在线观看| 成人av.网址在线网站| 欧美日在线观看| 国产精品丝袜一区二区三区| 久久视频这里只有精品| 色综合亚洲精品激情狠狠| 久精品免费视频| 亚洲自拍在线观看| 欧美成人免费播放| 亚洲免费视频网站| 欧美精品在线视频观看| 深夜福利亚洲导航| 国产日产欧美a一级在线| 美女av一区二区| 国产精品免费小视频| 久久视频这里只有精品| 成人福利网站在线观看| 人体精品一二三区| 国产午夜精品免费一区二区三区| 免费不卡欧美自拍视频| 亚洲福利影片在线| 国产不卡一区二区在线播放| www.亚洲免费视频| 亚洲精品美女久久久| 精品视频在线播放色网色视频| 日本久久中文字幕| 国产情人节一区| 国语自产偷拍精品视频偷| 日韩免费在线免费观看| 欧美视频不卡中文| 亚洲a在线播放| 秋霞午夜一区二区| 日韩欧美在线观看| 欧美激情乱人伦| 欧美成人自拍视频| 亚洲在线视频福利| 欧美二区在线播放| 一区二区亚洲欧洲国产日韩| 亚洲精品久久在线| 日韩中文综合网| 日韩欧美精品网址| 欧美极品美女视频网站在线观看免费| 国产97人人超碰caoprom| 精品激情国产视频| 久久人人爽人人爽爽久久| 欧美伊久线香蕉线新在线| 黄色成人在线免费| 最新的欧美黄色| 色噜噜亚洲精品中文字幕| 亚洲免费小视频| 韩国精品久久久999| 全球成人中文在线| 日韩av在线网址| 久久韩剧网电视剧| 怡红院精品视频| 精品久久久久久中文字幕一区奶水| 久久手机精品视频| 国产69精品久久久久9999| 91在线观看免费网站| 日韩视频免费在线观看| 色阁综合伊人av| 69av在线播放| 久久精品男人天堂| 亚洲女人天堂网| 亚洲精品国产免费| 日韩高清中文字幕| 成人精品视频99在线观看免费| 欧美理论电影网| 国产噜噜噜噜久久久久久久久| 亚洲最新av在线网站| 日韩激情第一页| 欧美亚洲成人xxx| 久久久久久91香蕉国产| 91精品国产91久久久久久| 亚洲成人亚洲激情| 久久理论片午夜琪琪电影网| 国产精品第一页在线| 欧美精品性视频| 亚洲性猛交xxxxwww| 国产日韩一区在线| 国产精品va在线| 精品国产91乱高清在线观看| 91老司机精品视频| 亚洲毛茸茸少妇高潮呻吟| 欧美性视频在线| 欧美影院在线播放| 亚洲欧美在线播放| 国产综合在线视频| 欧美精品九九久久| 日韩免费观看在线观看| 琪琪第一精品导航| 亚洲a级在线播放观看| 久久久久久av| 久久久成人精品| 国产欧美精品日韩| 午夜精品一区二区三区在线视| 亚洲女同性videos| 国产精品吊钟奶在线| 久久成年人视频| 日本最新高清不卡中文字幕| 国产欧美精品在线| 欧美精品成人在线| 北条麻妃一区二区三区中文字幕|