2014-03-29 55 views
-4

代碼1這兩個程序哪個更好,爲什麼?

int A, B, MAX; 
cout << "Give two numbers:" << endl; 
cin >> A >> B; 

if (A > B) 
{ 
    MAX = A; 
} 
else 
{ 
    MAX = B; 
} 
cout << "Largest amongst given numbers is: "; 
cout << MAX << endl; 
return 0; 

代碼2

int A, B, MAX; 
cout << "Give two numbers:" << endl; 
cin >> A >> B; 

MAX = A; 
if (B > MAX) 
{ 
    MAX = B; 
} 
cout << "Largest amongst given numbers is: "; 
cout << MAX << endl; 
return 0; 

在上述程序邏輯,其中的一個是最好的,爲什麼?他們之間有什麼區別?這是我的考試問題,我想問問堆棧溢出知道最好的意見。

+5

爲什麼不'MAX =標準:: MAX(A,B);'? – user2357112

+1

什麼是你最好的定義? – user1118321

+0

這兩個程序哪個更好,爲什麼? – user3474853

回答

0

我會說使用代碼2.最好是因爲你明確地說如果MAX B大於MAX A,那麼將MAX改爲B.另一個是,你沒有任何關於爲什麼MAX的定義因素A比MAX B.更大的從我所看到的,你會使用代碼1比代碼2

+3

我不同意;第一個看起來很清楚。如果A大於B,則A是最大值。否則,B是最大值。除了調用'std :: max'的答案外,這整個問題似乎基本上都是基於意見的。 – computerfreaker

+0

是的,我同意。 – MurphyTheTurtle

5
MAX = std::max(A, B); 

比無論是在清晰度方面更可能有一個更難的時間。

就速度而言,編譯器應該能夠優化這些方法中的任何一種方法;但我又喜歡std::max,因爲我會更快地相信編譯器優化標準函數而不是某些任意編寫的代碼來執行相同的任務。

1

它們是相同的,所以我更喜歡代碼1,因爲它更具可讀性。在這兩種情況下,您必須將A和B都帶入一個寄存器(不管),然後進行單個比較(不管)。它不會寫出變量MAX,直到完成該段(因爲它不需要將任何東西踢出寄存器)。

這不會導致任何性能增益。實際上,編譯器可能會編譯它們(編譯器會進行各種代碼修改以創建最佳指令集),這是可能的(儘管我懷疑它)。

建議唯一可能會提高性能的方法是使用庫函數std::max。這是因爲編譯器將基本上以最有效的方式執行比較(可能甚至沒有調用條件跳轉)。如果你的兩個值是整數,那麼你可以看到here可以找到帶有5個整數運算的最大值(除了乘法一般可以在一個週期內完成外)。您通常希望儘可能避免有條件的跳轉,並且此算法可以實現這一點。最有可能的最大函數做這樣或類似的東西(但它將不得不不同的浮點值)。

1

MAX = std::max(A,B)後,下一個最好的代碼是:

MAX = A > B ? A : B; 

如果你不想使用的話,我更喜歡你的 「代碼1」,因爲:

  • 碼2總是設置MAX = A,這是暫時的誤導,只有隨着後面的代碼被研究才變得清晰;雖然這個問題在C++和許多其他語言中很常見,但是當它很容易避免時,沒有特別的理由去容忍這種併發症。對於某些類型(該問題最初並未指定int),分配可能是一個昂貴的操作(例如複製大量的數據),所以總是分配一次比潛在分配兩次

對於這兩種原因的那些更好,它也可取聲明和在一個步驟中定義MAX。你不會需要一個誤導性的和潛在的低效或不可用默認:如果說這是一個非const參考接受作爲函數參數,但是當它是可能它的另一個很好的理由,更喜歡std::max或三元?方法可能不實際施工。 (現在您已將問題更改爲int具體,複製和構建的費用是已知的和微不足道的,在大多數情況下,優化器可以指望將其刪除)。

+0

在這個例子中最多設置兩次實際上不應該導致兩次寫入(如果你有一個可怕的編譯器,它可能會發生)。這種可能發生的唯一方法是如果類型是一些複雜的'struct'或object,'''操作符是一些複雜的函數。儘管如此,編譯器應該足夠聰明,以便在完成「A」和「B」的比較之前,不應該寫出「MAX」。所以它應該將'MAX'識別爲'A'的別名,並且只是加載'A'來執行比較(基本上這會將其更改爲代碼1)。 – Jared

+1

@我說的很多關於效率的問題早於編輯時說A和B是整數的問題。假設他們是字符串,那麼你的「它應該把MAX認作是一個別名」聽起來不錯,但如果它消除了副作用,比如B.size()> A.capacity() –