2012-03-10 58 views
2

如果我得到它的正確,__declspec(noalias)告訴編譯器,作爲參數傳遞的指針都沒有別名。如何在GCC上端口__declspec(noalias)

__declspec(noalias) void multiply(float * a, float * b, float * c) 
{ 
    ... 
} 

換一種說法,如果我沒有記錯的話,這是完全等同於對指針類型的每個參數調用__restrict。但有沒有辦法做到這一點,而不改變所有的函數調用?理想情況下,我會用預處理器定義替換__declspec(noalias)

回答

2

我認爲你錯誤地解釋了noalias;它與每個參數上指定的__restrict不同。在example you reference from MSDN中,這意味着a,bc不會修改或引用(當前編譯單元的)任何全局狀態,但它們可以自由別名。你可以指定__restrict在每一個表明他們不互相混淆。我不知道爲什麼你提到在這種情況下更改所有的函數調用;只要沒有呼叫者對參數進行別名,呼叫站點沒有任何變化。你應該審查所有的電話,但他們不需要改變,除非你需要刪除別名。具體來說,__restrict而不是需要在呼叫站點。

在GCC唯一類似物將是相同的源文件中的任何全局指針變量聲明(其是兼容的類型)指定__restrict(或more commonly for GCC__restrict__)。有關文件範圍restrict限定的指針,請參閱here。當然,不能保證GCC的行爲會有所不同,因爲restrict通常只在功能範圍內考慮。微軟明確引入了noalias來啓用他們引入的特定優化。長話短說,這裏沒有宏觀把戲(除了R提到的完全在GCC上忽略__declspec())。您可以做的最好的做法是將__restrict添加到任何非別名指針參數和全局變量聲明中。

+0

謝謝澄清!差異現在更清晰 – qdii 2014-01-24 10:51:19

1

只需#define __declspec(x)(空白定義)。省略noalias/restrict不會對的行爲進行正確程序的更改。它所做的只是爲編譯器創建額外的(通常非常小的,使用當前的編譯器技術)優化的機會。

+0

+1這個想法,但我不能接受這個解決方案。上下文是視頻遊戲,'__restrict'不是一個選項:) – qdii 2012-03-10 23:31:51

+0

您是否測量過在Windows上使用/不使用「noalias」的性能差異?不成熟的優化是萬惡之源。你試圖找到解決這個問題的浪費時間可能會更好地花在優化代碼中的更高級別的低效率上...... – 2012-03-10 23:57:34

+3

在這一點上,我完全同意你的看法。但即使優化在我的情況下毫無意義,我可以想象未來的讀者真的需要一個解決方案。 – qdii 2012-03-22 11:51:42