C語言中關鍵字restrict的概念,使用范圍,例子


  概念:

  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的結果,感覺是這個關鍵字沒有起作用,網上查了一下沒有查到原因,請知道答案的朋友解釋一下,多謝.

 

參考文檔:

1 https://en.cppreference.com/w/c/language/restrict

2 https://baike.baidu.com/item/restrict/7384270?fr=aladdin


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com