簡體   English   中英

將原始類型的常量引用作為函數參數傳遞

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

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