簡體   English   中英

我應該對引用使用 __restrict 嗎?

[英]Should I use __restrict on references?

在我編寫的程序中,我的 function 聲明之一是這樣的:

bool parse( const sentence & __restrict sentence )
{
  // whatever
}

當我使用 Microsoft Visual Studio 2010 Express 編譯代碼時,編譯器報錯:

警告 C4227:使用了時代錯誤:忽略引用上的限定符

但是,GCC 文檔的這一頁說:

除了允許受限指針外,您還可以指定受限引用,這表明該引用在本地上下文中沒有別名。

同一頁面給出了一個非常明確的例子:

 void fn (int *__restrict__ rptr, int &__restrict__ rref)
 {
   /* ... */
 }

我誤解了 MVSC 的警告嗎? 或者我應該將所有引用轉換為指針以便__restrict適用嗎?

C ++沒有像C99那樣的restrict概念。

但是,有幾個編譯器供應商為他們的C ++編譯器提供擴展,他們稱之為__restrict (請注意保留名稱!)。 鑒於這些是擴展 ,它們的行為由編譯器供應商決定。 您必須閱讀文檔並分別找出此擴展在每個編譯器中的作用。

僅僅因為兩個供應商選擇相同的名稱並不意味着擴展有任何共同點。

據推測,因為它以__ __restrict開頭是一個特定於實現的擴展,可以按照每個實現的需要運行。 我想在這種情況下兩個編譯器都是正確的。

而不是更改對指針的引用,為什么不完全避免restrict ,而是使用分析器來查找您的熱點,並且只有當它顯示C ++嚴格別名規則未涵蓋的此類別名占用大量CPU時間時才會考慮更改對指針的一個特定引用。

一般來說,你應該。 (但可能不在有問題的 function 中)。

C++ 確實沒有restrict關鍵字,因此有人可能會說您“不能”使用它。 但是我們都知道restrict對於優化代碼是有用的,甚至是重要的,尤其是沒有內聯的代碼; 並且您絕對應該指出代碼中的不同指針不能別名,如果它們不能別名的話。 人們經常隱含地假設沒有restrict 'ing 他們的指針。

但是請考慮缺少編譯器支持。 例如,僅適用於 G++/clang:

#ifdef __GNUC__
// great, __restrict__ is available
#else
// too bad, can't use __restrict__
#define __restrict__ 
#endif

int foo(int* __restrict__ a, int* __restrict__ b);

現在,您可能會想:“啊,但我問的是參考資料。” - 好吧...... function 的引用參數主要是一個語法可愛的指針,當然,這不是一回事,還有生命周期擴展規則,右值引用等等。 但仍然。


最后在你的 function 中,似乎sentence是唯一的指針(除非你從 function 主體的其他地方獲得其他指針)。 在這種情況下,您不必費心restrict它,因為它沒有任何別名。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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