C語言關鍵字RESTRICT介紹
學習C語言也有好長時間了,相信大家在學習C語言的過程中也都有所收穫,不過,也應該遇到了許多問題。今天小編在這裏就幫同學們介紹一下怎麼了解restrict這個詞。
要理解 restrict,先要知道什麼是 Pointer aliasing。
Pointer aliasing 是指兩個或以上的指針指向同一數據,例如
int i = 0;
int *a = &i;
int *b = &i;
這樣會有什麼問題呢?
如果編譯器採用最安全的`假設,即不理會兩個指針會否指向同一數據,那麼通過指針讀寫數據是很直觀的。
然而,這種假設會令編譯器無法優化,例如:
int foo(int *a, int *b)
{
*a = 5;
*b = 6;
return *a + *b; // 不一定是 11!
}
如果 a 和 b 都指向同一數據,*b = 6 會導致 *a = 6,返回12。所以編譯器在做 *a + *b 的時候,需要重新讀取 *a 指向的數據:
foo:
movl $5, (%rdi) # 存儲 5 至 *a
movl $6, (%rsi) # 存儲 6 至 *b
movl (%rdi), %eax # 重新讀取 *a (因為有可能被上一行指令造成改變)
addl $6, %eax # 加上 6
ret
如果我們確保兩個指針不指向同一數據,就可以用 restrict 修飾指針類型:
int rfoo(int *restrict a, int *restrict b)
{
*a = 5;
*b = 6;
return *a + *b;
}
編譯器就可以根據這個信息,做出優化:
rfoo:
movl $11, %eax # 在編譯期已計算出 11
movl $5, (%rdi) # 存儲 5 至 *a
movl $6, (%rsi) # 存儲 6 至 *b
ret
但如果用了 restrict 去修飾兩個指針,而它們在作用域內又指向同一地址,那麼是未定義行為。
總括而言,restrict 是為了告訴編譯器額外信息(兩個指針不指向同一數據),從而生成更優化的機器碼。注意,編譯器是無法自行在編譯期檢測兩個指針是否 alias。如使用 restrict,程序員也要遵守契約才能得出正確的代碼(指針不能指向相同數據)。
以個人經驗而言,編寫代碼時通常會忽略 pointer aliasing 的問題。更常見是在性能剖測時,通過反編譯看到很多宂餘的讀取指令,才會想到加入 restrict 關鍵字來提升性能。
-
2017年3月計算機二級C語言考試摸底測試題
以下是yjbys考試網小編整理的2017年3月計算機二級C語言考試摸底測試題,希望對大家有所幫助,祝大家計算機二級考試順利通過。一、選擇題(每小題1分。)(1)程序流程圖中帶有箭頭的線段表示的是()。A.圖元關係B.數據流C.控制流D.調用關係(2)結構化程序設計的基本原則...
-
C語言if else語句彙總
對於很多情況,順序結構的代碼是遠遠不夠的,大家都接觸過C語言吧,下面是小編為大家整理的C語言ifelse語句,希望對大家有所幫助。C語言ifelse語句在C語言中,使用if和else關鍵字對條件進行判斷。請先看下面的代碼:#includeintmain(){intage;printf("請輸入你的年齡:");sc...
-
C語言精選面試題詳解
C語言是IT編程中最基礎的語言,在面試中,基本可以忽略又或者格外重要。下面是小編為大家整理的C語言精選面試題詳解,歡迎參考~分析這些面試題,本身包含很強的趣味性;而作為一名研發人員,通過對這些面試題的深入剖析則可進一步增強自身的內功。試題1:以下是引用片段:voi...
-
2017年計算機二級考試C語言備考題及答案
計算機二級對於很多考生來説還是比較有難度的,那麼怎樣順利通過二級考試呢?這就需要大家平時多練習和找方法了。以下是本站小編整理的2017年計算機二級考試C語言備考題及答案,希望對大家有幫助!1.(A)是構成C語言程序的基本單位。A、函數B、過程C、子程序D、子例...
相關文章
- Protecting water resources英語作文
- 關於人的性格的英語作文:The Diversity of Characters
- C語言register關鍵字的使用
- Crack Researchers Create Gutsier Glass英語作文
- C語言中的static和extern關鍵字的作用
- 英語作文:Extracurricular Activities
- C語言關鍵字:auto、static、register、const
- 關於creativity與curiosity的英語作文
- register關鍵字在c語言和c++中的差異
- C++中const-cast與reinterpret-cast運算符的用法