[英]Why does the 'const' qualifier on return type have no effect on functions that are marked with __forceinline/inline?
[英]In which cases will the restrict qualifier applied to a return value have an effect?
如果我有這樣聲明的成員函數:
double* restrict data(){
return m_data; // array member variable
}
limit關鍵字可以做什么?
顯然,對於g ++(x86體系結構)來說 , 它不能實現 ,但是是否存在其他編譯器/體系結構可以使這種類型的構造有意義,並且可以優化機器代碼的生成?
我之所以問是因為Blitz庫(Blitz ++)具有以這種方式聲明的全部功能,因此除非有人真正執行某項操作,否則有人進入並添加strict關鍵字是沒有意義的。 因此,在我刪除restrict
(消除編譯器警告)之前,我想知道如何濫用代碼。
我們要談什么restrict
?
目前, restrict
是非標准的。這意味着它是編譯器擴展; 從C ++標准不要求其存在的意義上說,它是不可移植的,在它里面也沒有任何正式的文本可以告訴我們它應該做什么。
restrict
當前是C ++中特定於編譯器的,必須依靠他們選擇的編譯器文檔才能確切了解它在做什么。
一些想法
以下是有關使用多篇論文restrict
,其中包括:
在幾個地方暗示restrict
的目的是限定指針,以便編譯器知道相同作用域中的兩個指針不指向相同的內存位置。
考慮到這一點,我們可以很容易地看到return類型與其他指針沒有潛在的沖突 ,因此在這種情況下使用它通常不會獲得任何優化機會。 然而; 一個必須參照使用實施記錄的行為肯定知道。至於說: restrict
不達標, 但 。
我還找到了以下線程, Blitz ++的開發人員在該線程上討論了刪除對函數的返回類型應用的strict
,因為它沒有任何作用:
小筆記
作為進一步的說明,這里是什么LLVM文件說,有關noalias
VS restrict
:
對於函數返回值,C99的限制沒有意義,而LLVM的noalias是有意義的。
通常,限制限定符只能幫助更好地優化代碼。 通過刪除“限制”,您不會破壞任何內容,但是如果不加小心地添加它,則會出現一些錯誤。 一個很好的例子是memcpy和memmove之間的區別。 您始終可以使用速度較慢的記憶,但只有在知道src和dst不重疊的情況下,才可以使用速度較快的記憶。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.