2016-02-02 46 views
2

我想知道什麼是最有效的,在操作方面,交換整數的方式是在C++中,爲什麼?是這樣的:最有效的交換值的方式C++

int a =..., b = ...; 
a = a + b; 
b = a - b; 
a = a - b; 

比使用臨時更有效嗎?還有其他更有效的方法嗎? (不要求其他方式來交換整數),爲什麼它們會更有效率?

+6

我建議['標準:: swap'(http://en.cppreference.com/w/cpp/algorithm/swap) – NathanOliver

+0

在現代機器上,這可能是交換整數的最慢方法。如果你有一臺帶有兩個寄存器的機器,這可能是一個好主意,特別是如果它有一個鼓內存。 – molbdnilo

回答

2

賦值總是比算術運算更快。

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 ::互換,甚至更好,因爲重塑編程車輪從來就不是一個好主意

+0

這是一個可能的實現,是的。但不一定會被稱爲整數。這只是一個合理的默認值。 – StoryTeller

+0

也可以這樣做:t1 = std :: exchange(t2,t1);' – StoryTeller

5

最好的方法是信任你的編譯器使用C++標準庫函數。它們是爲彼此設計的。

std::swap會贏。

對於int(不需要臨時),您可以使用XOR交換,但現在它仍然不如std::swap

+0

好的,謝謝,沒有意識到標準函數會比幾行代碼更快。 –

+0

我會補充說它的性能不如'std :: swap',因爲'std :: swap'可能會在某些體系結構中與單個機器指令進行交換。 – StoryTeller

+0

@MaraJade我的經驗法則是用標準提供的函數/結構體驗它。如果你分析並發現他們沒有足夠的性能,那麼尋找替代品。 – NathanOliver