我想知道什麼是最有效的,在操作方面,交換整數的方式是在C++中,爲什麼?是這樣的:最有效的交換值的方式C++
int a =..., b = ...;
a = a + b;
b = a - b;
a = a - b;
比使用臨時更有效嗎?還有其他更有效的方法嗎? (不要求其他方式來交換整數),爲什麼它們會更有效率?
我想知道什麼是最有效的,在操作方面,交換整數的方式是在C++中,爲什麼?是這樣的:最有效的交換值的方式C++
int a =..., b = ...;
a = a + b;
b = a - b;
a = a - b;
比使用臨時更有效嗎?還有其他更有效的方法嗎? (不要求其他方式來交換整數),爲什麼它們會更有效率?
賦值總是比算術運算更快。
C++ implementation爲化std :: swap是
template<typename T> void swap(T& t1, T& t2) {
T temp = std::move(t1); // or T temp(std::move(t1));
t1 = std::move(t2);
t2 = std::move(temp);
}
所以使用一個臨時變量是不是做算術技巧更好。
而要使用std ::互換,甚至更好,因爲重塑編程車輪從來就不是一個好主意
這是一個可能的實現,是的。但不一定會被稱爲整數。這只是一個合理的默認值。 – StoryTeller
也可以這樣做:t1 = std :: exchange(t2,t1);' – StoryTeller
最好的方法是信任你的編譯器和使用C++標準庫函數。它們是爲彼此設計的。
std::swap
會贏。
對於int
(不需要臨時),您可以使用XOR交換,但現在它仍然不如std::swap
。
好的,謝謝,沒有意識到標準函數會比幾行代碼更快。 –
我會補充說它的性能不如'std :: swap',因爲'std :: swap'可能會在某些體系結構中與單個機器指令進行交換。 – StoryTeller
@MaraJade我的經驗法則是用標準提供的函數/結構體驗它。如果你分析並發現他們沒有足夠的性能,那麼尋找替代品。 – NathanOliver
我建議['標準:: swap'(http://en.cppreference.com/w/cpp/algorithm/swap) – NathanOliver
在現代機器上,這可能是交換整數的最慢方法。如果你有一臺帶有兩個寄存器的機器,這可能是一個好主意,特別是如果它有一個鼓內存。 – molbdnilo