[英]Passing constant references of primitive types as function arguments
考慮以下功能:
template <class T, class Priority>
void MutableQueue<T, Priority>::update(const T& item, const Priority& priority)
{
...
}
如果優先級類型可以放在寄存器中,那么現代x86-64編譯器是否足夠智能以按值傳遞優先級參數而不是引用?
正如@black所提到的,優化依賴於編譯器和平台。 也就是說,我們通常期望在使用優秀的優化編譯器時,每天都會進行一些優化。 例如,我們依靠函數內聯,寄存器分配,將常數乘法和除法轉換為可能的位移等。
回答你的問題
如果優先級類型可以放在寄存器中,那么現代x86-64編譯器是否足夠智能以按值傳遞優先級參數而不是引用?
我會簡單地嘗試一下。 你自己看:
這是代碼:
template<typename T>
T square(const T& num) {
return num * num;
}
int sq(int x) {
return square(x);
}
GCC- -O3
, -O2
和-O1
可靠地執行此優化。
另一方面,Clang 3.5.1似乎沒有執行這種優化。
你應該指望這樣的優化發生嗎? 並不總是,而不是絕對 - C ++標准沒有說明何時可以進行這樣的優化。 實際上,如果您正在使用GCC,您可以“ 期望 ”進行優化。
如果您絕對肯定希望確保進行此類優化,則需要使用模板專業化 。
編譯器可以進行優化,但不是強制性的。
要強制傳遞“最佳”類型,您可以使用boost: http : //www.boost.org/doc/libs/1_55_0/libs/utility/call_traits.htm
用call_traits<T>::param_type
替換const T&
(傳遞值的方法是正確的)。
所以你的代碼可能變成:
template <class T, class Priority>
void MutableQueue<T, Priority>::update(call_traits<T>::param_type item,
call_traits<Priority>::param_type priority)
{
...
}
這完全取決於平台和編譯器,參數傳遞給函數的方式也是如此。
這些細節在程序運行的系統的ABI中定義; 一些寄存器有很多寄存器,因此主要使用它們。 有些人將它們全部推到堆疊上。 有些人將它們混合在一起直到第N個參數。
同樣,這是你不能依賴的東西; 但是你可以通過幾種方式檢查它。 C ++語言沒有寄存器的概念。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.