2011-08-01 15 views
0

我無法通過搜索找到答案,因此下一步是詢問。說我有一些像這樣的代碼:C++中的函數調用常量傳播

template<class Int> 
inline Int onbit(Int value, int n) { 
    return value | (static_cast<Int>(1) << n); 
} 

如果我調用的代碼,這樣onbit(A, 4),將不斷4通過傳播和優化,或者我應該使它成爲一個模板(template<int n, class Int>),因此,這將是不變。這裏是否需要C++ 0x constexpr,如果是這樣,我該如何使用它(應該是int n是const還是constexpr?)。

我知道constexpr可以使用常量參數,但是如果部分參數是常量而且部分是可變的,它會部分優化嗎?

摘要:函數(它必須是行內正確的嗎?)可以通過不斷的傳播進行部分優化,如果有的話,它有什麼要求?

即使我寫這,我想,內聯函數調用將會傳播常數...

+1

您是否嘗試查看編譯器生成的代碼? –

+0

常量摺疊在現代編譯器中非常普遍。無論你是否製作模板參數,我都懷疑這個問題很重要。 –

回答

3

你不能保證所有編譯器將優化這段代碼,雖然現代的編譯器(MSVC和gcc)會,至少在大多數情況下(這取決於上下文)不考慮常量因爲這個功能非常簡單。

在另一方面,你不能保證任何編譯將優化其嚴格把好當你使用常量。

所以,如果優化對您很重要,在所有情況下唯一的答案是 - 在重要的情況下檢查您的程序集。您的編譯器可能會在一個文件中對其進行優化,而不是對其他文件進行優化(例如,當此函數在複雜模板內深度調用時,儘管在某些情況下編譯器的優化器放棄而不優化它是可想而知的)。

我相信只有在需要進行編譯時檢查時才應該依賴const,並且當運行時效率需要時,您應該依賴檢查生成的程序集。

1

在最有可能的情況,是的,它應該這樣做,你在呼喚Onbit(A,4)即使在你已經給出了代碼的形式。但是,我們再次希望編譯器能夠做到這一點。你無法確定優化會完成。標準已經讓編譯器實現了他們想要的方式。

-3

您需要將int n添加到模板參數中以強制執行「常量傳播」。請記住,您將爲每個調用atbit()的地方生成新的機器代碼,並使用不同的n作爲模板參數(如果您傳播常量,我認爲這是您必須忍受的)。

對函數進行模板化並不意味着編譯器內聯它。編譯器需要從模板內嵌生成的代碼(如果您確信自己比編譯器更好,您應該能夠使用編譯器特定的擴展來覆蓋它)。

但是,如果您正在考慮執行常量傳播和內聯擴展的組合,我會建議使用宏。C/C++中沒有任何其他功能可以以一種跨平臺的方式將內聯和常量傳播結合起來。

#define ON_BIT(v,n) ((v) | 1 << (n)) 

或類似的東西。我知道使用宏是邪惡的......但是我想你是一個壞男孩,想着先進的優化:)。

+0

PURE EVIL =包含其他C++關鍵字(如'return')的宏,因爲它沒有TYPICAL_UGLY_UPPERCASE_NAME()而無法識別爲宏。你的宏不執行OP的'onBit'函數。 – smerlin

+0

啊...對不起,糾正了我的帖子。但我確實支持我的(現實的)解決方案。 – ritesh

+0

你沒有糾正你的帖子,你仍然把一個邪惡的宏僞裝成一個正常的函數。 – smerlin

相關問題