概念:
restrict,C語言中的一種類型限定符(Type Qualifiers),用於告訴編譯器,對象已經被指針所引用,不能通過除該指針外所有其他直接或間接的方式修改該對象的內容。
淵源:
restrict是c99標准引入的,它只可以用於限定和約束指針,並表明指針是訪問一個數據對象的唯一且初始的方式.即它告訴編譯器,所有修改該指針所指向內存中內容的操作都必須通過該指針來修改,而不能通過其它途徑(其它變量或指針)來修改;這樣做的好處是,能幫助編譯器進行更好的優化代碼,生成更有效率的匯編代碼.如 int *restrict ptr, ptr 指向的內存單元只能被 ptr訪問到,任何同樣指向這個內存單元的其他指針都是未定義的,直白點就是無效指針。restrict 的出現是因為 C 語言本身固有的缺陷,C 程序員應當主動地規避這個缺陷,而編譯器也會很配合地優化你的代碼.
使用場景:
例子:
1 #include <stdio.h> 2 3 int foo(int *a, int *b) 4 { 5 *a = 5; 6 *b = 6; 7 return *a + *b; 8 } 9 10 int rfoo(int *restrict a, int *restrict b) 11 { 12 *a = 5; 13 *b = 6; 14 return *a + *b; 15 } 16 17 int main() 18 { 19 int i =0; 20 int *a = &i; 21 int *b = &i; 22 23 printf("%d ",foo(a,b)); 24 printf("%d ", rfoo(a,b)); 25 26 }
在gcc 8.1 下的運行結果:
不過,我有一點是疑惑的,暫時沒有想清楚,就是我在自己的ubuntu 16.04上編譯,一直是不會運行出來11的結果,感覺是這個關鍵字沒有起作用,網上查了一下沒有查到原因,請知道答案的朋友解釋一下,多謝.
參考文檔:
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。