linux C restrict關鍵字用法

2021-09-01 05:45:31 字數 1099 閱讀 9176

c99中新增加了乙個型別定義,就是restrict。

看了下網上的相關貼子,但還是問題解決的不夠。下面是相關乙個文章,我將在後面再加相關說明:

那麼restrict的意義是什麼呢?

概括的說,關鍵字restrict只用於限定指標;該關鍵字用於告知編譯器,所有修改該指標所指向內容的操作全部都是基於(base on)該指標的,即不存在其它進行修改操作的途徑;這樣的後果是幫助編譯器進行更好的**優化,生成更有效率的彙編**。

舉個簡單的例子

int foo (int* x, int* y)

...

很顯然函式foo()的返回值是0,除非引數x和y的值相同。可以想象,99%的情況下該函式都會返回0而不是1。然而編譯起必須保證生成100%正確的**,因此,編譯器不能將原有**替換成下面的更優版本

int f (int* x, int* y)

...

啊哈,現在我們有了restrict這個關鍵字,就可以利用它來幫助編譯器安全的進行**優化了

int f (int *restrict x, int *restrict y)

...

此時,由於指標 x 是修改 *x的唯一途徑,編譯起可以確認 「*y=1; 」這行**不會修改 *x的內容,因此可以安全的優化為

int f (int *restrict x, int *restrict y)

...

最後注意一點,restrict是c99中定義的關鍵字,c++目前並未引入;在gcc可通過使用引數" -std=c99"

來開啟對c99的支援

下面是我從c語言核心技術一書上摘的:

void *memcpy( void * restrict dest ,const void * restrict src,sizi_t n) 這是乙個很有用的記憶體複製函式,由於兩個引數都加了restrict限定,所以兩塊區域不能重疊,即 dest指標所指的區域,不能讓別的指標來修改,即src的指標不能修改. 相對應的別乙個函式 memmove(void *dest,const void * src,size_t)則可以重疊。

內容來自網頁:

removeFromSuperview關鍵的幾個點

removefromsuperview unlinks the receiver from its superview and its window,and removes it from the responder chain.譯 把當前view從它的父view和視窗中移除,同時也把它從響應事件操...

hibernate criteria 多表關聯查詢

當qbc criteria關聯查詢的時候一般都需要取別名。今天就遇到乙個問題 先貼 修改之後正確的 override public searchresultfindlistpagebykeyword integer page,integer pagesize,string keyword,long ...

Mongoose aggregate 多表關聯查詢

使用mongoose操作mongodb資料庫進行關聯查詢是一種比較常見的操作,操作方式有哪幾種呢?下面用乙個具體的案例來演示。首先模擬一點資料,分別有 order 和 order item 兩個集合 order 集合裡的資料 order item 集合裡的資料 假設要做這樣的乙個操作 查詢 orde...