簡體   English   中英

在哪些情況下,將限制限定符應用於返回值會產生影響?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM