c++返回性能

C++ Return Performance

本文关键字:性能 返回 c++      更新时间:2023-10-16

我有一个关于性能的问题。我认为这也适用于其他语言(不仅仅是c++)。

假设我有这样一个函数:

int addNumber(int a, int b){
    int result = a + b;
    return result;
}
如果我像这样写上面的代码,是否有任何性能改进?
int addNumber(int a, int b){
     return a + b;
}

我有这个问题是因为第二个函数没有声明第三个变量。但是编译器会在第一个代码中检测到这一点吗?

要回答这个问题,您可以查看生成的汇编代码。使用-O2, x86-64 gcc 6.2为这两个方法生成完全相同的代码:

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

只有在没有打开优化的情况下,才有区别:

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

但是,没有优化的性能比较是没有意义的

原则上这两种方法没有区别。大多数编译器处理这种类型的优化已经有几十年了。

此外,如果函数可以内联(例如,当编译使用这种函数的代码时,编译器可以看到它的定义),大多数编译器将完全消除该函数,并简单地发出代码来添加传递的两个变量并存储调用者所需的结果。

显然,上面的注释假设编译带有相关的优化设置(例如,不进行没有优化的调试构建)。

就我个人而言,无论如何我都不会写这样的函数。在调用者中,编写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;
 }