2016-10-09 66 views
3

我有一個關於性能的問題。我認爲這也適用於其他語言(不僅僅是C++)。C++返回性能

想象一下,我有這樣的功能:

int addNumber(int a, int b){ 
    int result = a + b; 
    return result; 
} 

是否有任何性能的提高,如果我寫上面這樣的代碼?

int addNumber(int a, int b){ 
    return a + b; 
} 

我有這個問題,因爲第二個函數不會聲明第三個變量。但編譯器會在第一個代碼中檢測到這個嗎?

+0

這取決於你的編譯器和,編譯器內,其優化設置。它仍然非常適合優化 - 甚至可能被內聯計算所取代。 – usr2564301

+3

當開啓優化時,大多數編譯器將爲這兩個函數生成完全相同的程序集。 –

+1

您可以編譯它,查看生成的程序集,並親自查看。 –

回答

8

要回答這個問題,您可以look at the generated assembler code。隨着-02,X86-64 GCC 6.2生成正是這兩種方法相同的代碼:

addNumber(int, int): 
    lea  eax, [rdi+rsi] 
    ret 
addNumber2(int, int): 
    lea  eax, [rdi+rsi] 
    ret 

只有沒有開啓優化,there is a difference

addNumber(int, int): 
    push rbp 
    mov  rbp, rsp 
    mov  DWORD PTR [rbp-20], edi 
    mov  DWORD PTR [rbp-24], esi 
    mov  edx, DWORD PTR [rbp-20] 
    mov  eax, DWORD PTR [rbp-24] 
    add  eax, edx 
    mov  DWORD PTR [rbp-4], eax 
    mov  eax, DWORD PTR [rbp-4] 
    pop  rbp 
    ret 
addNumber2(int, int): 
    push rbp 
    mov  rbp, rsp 
    mov  DWORD PTR [rbp-4], edi 
    mov  DWORD PTR [rbp-8], esi 
    mov  edx, DWORD PTR [rbp-4] 
    mov  eax, DWORD PTR [rbp-8] 
    add  eax, edx 
    pop  rbp 
    ret 

然而,沒有優化的性能比較是沒有意義的

2

原則上兩種方法沒有區別。大多數編譯器已經處理了幾十年來的這種優化。另外,如果函數可以內聯(例如編譯器在編譯使用這樣的函數的代碼時它的定義是可見的),大多數編譯器將完全消除該函數,並且簡單地發出代碼來添加傳遞的兩個變量並根據調用者的要求存儲結果。顯然,上面的註釋假定用相關的優化設置進行編譯(例如,不進行沒有優化的調試構建)。

個人而言,我不會寫這樣的功能。在調用者中,編寫c = a + b而不是c = addNumber(a, b)比較容易,所以具有這樣的功能對程序員(努力理解)或程序(性能等)沒有任何益處。你不妨寫下沒有提供有用信息的評論。

c = a + b; // add a and b and store into c 

任何自尊的代碼審查者都會抱怨關於無信息功能或無信息的評論。

我只使用了這樣的功能,如果它的名字傳達一些特殊含義(即不只是添加兩個值)的應用

c = FunkyOperation(a,b); 

int FunkyOperation(int a, int b) 
{ 
    /* Many useful ways of implementing this operation. 
      One of those ways happens to be addition, but we need to 
      go through 25 pages of obscure mathematical proof to 
      realise that 
    */ 

    return a + b; 
}