C語言關鍵字 restrict(一)

2021-09-19 15:10:33 字數 1519 閱讀 9884

概念:

restrict,c語言中的一種型別限定符(type qualifiers),用於告訴編譯器,物件已經被指標所引用,不能通過除該指標外所有其他直接或間接的方式修改該物件的內容。

淵源:

restrict是c99標準引入的,它只可以用於限定和約束指標,並表明指標是訪問乙個資料物件的唯一且初始的方式.即它告訴編譯器,所有修改該指標所指向記憶體中內容的操作都必須通過該指標來修改,而不能通過其它途徑(其它變數或指標)來修改;這樣做的好處是,能幫助編譯器進行更好的優化**,生成更有效率的彙編**.如 int *restrict ptr, ptr 指向的記憶體單元只能被 ptr訪問到,任何同樣指向這個記憶體單元的其他指標都是未定義的,直白點就是無效指標。restrict 的出現是因為 c 語言本身固有的缺陷,c 程式設計師應當主動地規避這個缺陷,而編譯器也會很配合地優化你的**.

使用場景:

理論解釋較為抽象,根據《c primier plus 6th》的解釋,舉出以下例子:

#include

#include

#include

#include

int main()

;int *parr = arr;

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

memset(rstar, 0x00 ,sizeof(int)*10);

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

if(rstar != null)

return 0;

}

該例子編譯時需要加上  -std=c99 選項

其實上述例子看不出什麼問題,只是編譯器在會進行一定的優化。由於用 restrict 關鍵字修飾的指標 rstar ,在編譯過程中,編譯器認為,只有 rstar 指標可以訪問上面 malloc 的區域。故在迴圈體中的rstar[i]  += 5;和rstar[i]  += 3;能合成一條

rstar[i]  += 8;以做優化。像是 arr 或是 parr ,能夠訪問到其位址區域的方式太多,編譯器不敢貿然進行優化,故就按照正常流程一點一點編譯。書中還舉了乙個memcpy的例子更為形象。

在c99中, 這兩個函式的原型是:

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

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

在memcpy中,指標s1 和 指標s2 都加上了 restrict 優化,其意義為,s1的指向的記憶體區域只能用s1來呼叫,s2的指向的記憶體區域只能用s2來呼叫,在restrict 的限定下,s1指向的區域與s2指向的區域相重合(重疊的意思也就是s1指向的區域有可能被s2指標應用,或是相反)是不允許的,故利用memcpy不會出現兩個記憶體區域重合的情況。memmove則要考慮複製記憶體重合的情況。

C語言關鍵字restrict

簡介 關鍵字restrict只用於限定指標 該關鍵字用於告知編譯器,所有修改該指標所指向內容的操作全部都是基於該指標的,即不存在其他進行修改操作的途徑 這樣的後果是幫助編譯器進行更好的優化,生成更有效率的彙編 例如int i 0 int a i int b i 這樣會存在乙個問題。int foo i...

C語言的restrict關鍵字

restrict是c99標準引入的,它只可以用於限定和約束指標,並表明指標是訪問乙個資料物件的唯一且初始的方式.即它告訴編譯器,所有修改該指標所指向記憶體中內容的操作都必須通過該指標來修改,而不能通過其它途徑 其它變數或指標 來修改 這樣做的好處是,能幫助編譯器進行更好的優化 生成更有效率的彙編 由...

C語言中restrict關鍵字學習

簡介 restrict是 c99標準引入的,它只可以用於限定和約束 指標,並表明指標是訪問乙個 資料物件 的唯一且初始的方式.即它告訴 編譯器,所有修改該指標所指向記憶體中內容的操作都必須通過該指標來修改,而不能通過其它途徑 其它 變數或指標 來修改 這樣做的好處是,能幫助編譯器進行更好的優化 生成...