restrict和volatile

restrict

允許編譯器優化某部分代碼以更好地支持計算,它只能用於指針,表明該指針是訪問數據對象的唯一且初始的方式。
用於告訴編譯器,對象已經被指針所引用,不能通過除該指針外所有其他直接或間接的方式修改該對象的內容。

#include<stdio.h>
int main()
{
	int arr[10];
	int *restrict restar=(int *)malloc(10*sizeof(int));
	int *par=ar;
	for(int n=0;n<10;n++)
	{
		par[n]+=5;
		restar[n]+=5;
		arr[n]*=2;
		par[n]+=3;
		restar[n]+=3;	 
	}
}

因爲restar是訪問它所指向的數據塊的唯一且初始的方式,編譯器可以把涉及restart的兩條語句替換成下面這條語句,效果相同 
                restar[n]+=8;
但是把與par相關的兩條語句替換成下面的語句,將導致計算錯誤
                par[n]+=8;
因爲for循環在par兩次訪問相同的數據之間,用ar改變了該數據的值.在該例中,如果使用了 restrict 關鍵字,編譯器就可以選擇捷徑優化計算 

restrict還可用於函數形參中的指針,這意味着編譯器可以假定在函數體內其他
標識符不會修改該指針指向的數據,而且編譯器可以嘗試對其優化,使其不做別的用途

volatile 類型限定符

告知計算機,代理可以改變該變量的值,通常,它被用於硬件地址及 在其他程序或同時運行的線程中共享數據,例如,一個地址上可能存儲着當前的時鐘時間,無論程序做什麼,地址上的值都隨着時間的變化而改變,或者一個地址用於接受另一臺計算機傳入的信息.簡單地說就是防止編譯器對代碼進行優化。 確保本條指令不會因編譯器的優化而省略,且要求每次直接讀值.精確地說就是,優化器在用到這個變量時必須每次都小心地重新讀取這個變量的值,而不是使用保存在寄存器裏的備份。 

volatile int locl; 	//易變型變量,locl 是一個易變的位置說明這變量可能會被意想不到的改變,這樣,編譯器就不會假設這個變量的值了 
volatile int *ploc;		//指向易變型變量的指針,

val1=x;
val2=x;
智能的(進行優化的)編譯器會注意到以上代碼使用了兩次x,但並未改變它的值,於是編譯器
把x的值臨時存儲在寄存器中,然後在val2需要使用x時,才從寄存器中(而不是從原始內存位置
上)讀取x的值,以節約時間,這個過程被稱爲高速緩存。
	但是如果一些其他代理在以上兩句語句之間改變了x的值,就不能這樣優化了,如果沒有
volatile 關鍵字,編譯器就不會知道這種事情是否會發生。而現在,如果未使用volatile 關鍵字,編譯
器會假定變量的值在使用過程中不變,然後嘗試優化 

volatile const int loc;		//程序不能改變的變量,但是可以通過代理改變 
const volatile int *ploc; 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章