C 語言restrict 關鍵字的使用淺談

來源:互聯網
上載者:User

C99中新增加了restrict修飾的指標:

由restrict修飾的指標是最初唯一對指標所指向的對象進行存取的方法,
僅當第二個指標基於第一個時,才能對對象進行存取。
對對象的存取都限定於基於由restrict修飾的指標運算式中。

由restrict修飾的指標主要用於函數形參,或指向由malloc()分配的記憶體空間。
restrict資料類型不改變程式的語義。
編譯器能通過作出restrict修飾的指標是存取對象的唯一方法的假設,更好地最佳化某些類型的常式。

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

int *restrict ptr,

ptr 指向的記憶體單元只能被 ptr 訪問到,任何同樣指向這個記憶體單元的其他指標都是未定義的,
直白點就是無效指標。

restrict 的出現是因為 C 語言本身固有的缺陷,
C 程式員應當主動地規避這個缺陷,而編譯器也會很配合地最佳化你的代碼.

例子 :

複製代碼 代碼如下:int ar[10];
int * restrict restar=(int *)malloc(10*sizeof(int));
int *par=ar;
for(n=0;n<10;n++)
{
par[n]+=5;
restar[n]+=5;
ar[n]*=2;
par[n]+=3;
restar[n]+=3;
}

因為restar是訪問分配的記憶體的唯一且初始的方式,那麼編譯器可以將上述對restar的操作進行最佳化:
restar[n]+=8;

而par並不是訪問數組ar的唯一方式,因此並不能進行下面的最佳化:
par[n]+=8;

因為在par[n]+=3前,ar[n]*=2進行了改變。
使用了關鍵字restrict,編譯器就可以放心地進行最佳化了。

關鍵字restrict有兩個讀者。
一個是編譯器,它告訴編譯器可以自由地做一些有關最佳化的假定。
另一個讀者是使用者,他告訴使用者僅使用滿足restrict要求的參數。

一般,編譯器無法檢查您是否遵循了這一限制,如果您蔑視它也就是在讓自己冒險。
To help the compiler determine memory dependencies,
you can qualify a pointer, reference, or array
with the restrict keyword.
The restrict keyword is a type qualifier that may be
applied to pointers, references, and arrays.
Its use represents a guarantee by the programmer
that within the scope of the pointer declaration
the object pointed to can be accessed only by that pointer.

Any violation of this guarantee renders the program undefined.
This practice helps the compiler optimize certain sections of code
because aliasing information can be more easily determined.

Use of the restrict type qualifier with pointers

複製代碼 代碼如下:void func1(int * restrict a, int * restrict b)
{
/* func1's code here */
}

In the example that follows, the restrict keyword is
used to tell the compiler that the function func1 is
never called with the pointers a and b pointing
to objects that overlap in memory.
You are promising that accesses through a and b
will never conflict; this means that a write through one pointer
cannot affect a read from any other pointer.
The precise semantics of the restrict keyword are
described in the 1999 version of the ISO C standard.

Use of the restrict type qualifier with arrays

複製代碼 代碼如下:void func2(int c[restrict], int d[restrict])
{
int i;

for(i = 0; i < 64; i++)
{
c[i] += d[i];
d[i] += 1;
}
}

This example illustrates using the restrict keyword when passing arrays to a function.
Here, the arrays c and d should not overlap, nor should c and d point to the same array.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.