C語言中restrict關鍵字學習

2021-07-25 23:03:27 字數 1476 閱讀 5781

簡介:

restrict是

c99標準引入的,它只可以用於限定和約束

指標,並表明指標是訪問乙個

資料物件

的唯一且初始的方式.即它告訴

編譯器,所有修改該指標所指向記憶體中內容的操作都必須通過該指標來修改,而不能通過其它途徑(其它

變數或指標)來修改;這樣做的好處是,能幫助編譯器進行更好的優化**,生成更有效率的彙編**.如 int *restrict ptr, ptr 指向的記憶體單元只能被 ptr 訪問到,任何同樣指向這個記憶體單元的其他指標都是未定義的,直白點就是無效指標。restrict 的出現是因為 c 語言本身固有的缺陷,c 程式設計師應當主動地規避這個缺陷,而編譯器也會很配合地優化你的**.

考慮下面的例子:

int ar[10];

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

int *par=ar;

這裡說明restar是訪問由malloc()分配的記憶體的唯一且初始的方式。par就不是了。

那麼:for(n=0;n<10;n++)

因為restar是訪問分配的記憶體的唯一且初始的方式,那麼

編譯器可以將上述對restar的操作進行優化:

restar[n]+=8;

而par並不是訪問

陣列ar的唯一方式,因此並不能進行下面的優化:

par[n]+=8;

因為在par[n]+=3前,ar[n]*=2進行了改變。使用了

關鍵字restrict,編譯器就可以放心地進行優化了。

這個關鍵字據說**於古老的fortran。有興趣的看看這個。

c庫中有兩個函式可以從乙個位置把位元組複製到另乙個位置。在c99標準下,它們的原型如下:

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

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

這兩個函式均從s2指向的位置複製n位元組資料到s1指向的位置,且均返回s1的值。兩者之間的差別由關鍵字restrict造成,即memcpy()可以假定兩個記憶體區域沒有重疊。memmove()函式則不做這個假定,因此,複製過程類似於首先將所有位元組複製到乙個臨時緩衝區,然後再複製到最終目的地。如果兩個區域存在重疊時使用memcpy()會怎樣?其行為是不可預知的,既可以正常工作,也可能失敗。在不應該使用memcpy()時,編譯器不會禁止使用memcpy()。因此,使用memcpy()時,您必須確保沒有重疊區域。這是程式設計師的任務的一部分。

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

原文:書本c primer plus第12章 12.7.3 型別限定詞restrict

C語言關鍵字restrict

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

C語言的restrict關鍵字

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

C語言關鍵字 restrict(一)

概念 restrict,c語言中的一種型別限定符 type qualifiers 用於告訴編譯器,物件已經被指標所引用,不能通過除該指標外所有其他直接或間接的方式修改該物件的內容。淵源 restrict是c99標準引入的,它只可以用於限定和約束指標,並表明指標是訪問乙個資料物件的唯一且初始的方式.即...