首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++返回性能

C++返回性能
EN

Stack Overflow用户
提问于 2016-10-09 00:05:12
回答 2查看 187关注 0票数 3

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

假设我有这样的功能:

代码语言:javascript
复制
int addNumber(int a, int b){
    int result = a + b;
    return result;
}

如果我像这样写上面的代码,有什么性能改进吗?

代码语言:javascript
复制
int addNumber(int a, int b){
     return a + b;
}

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-09 00:15:26

要回答这个问题,你可以look at the generated assembler code。使用-O2,x86-64 gcc 6.2为这两种方法生成完全相同的代码:

代码语言:javascript
复制
addNumber(int, int):
    lea     eax, [rdi+rsi]
    ret
addNumber2(int, int):
    lea     eax, [rdi+rsi]
    ret

只有在没有启动优化的情况下,there is a difference

代码语言:javascript
复制
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

然而,在没有优化的情况下进行性能比较是毫无意义的。

票数 7
EN

Stack Overflow用户

发布于 2016-10-09 00:57:58

原则上,这两种方法没有区别。大多数编译器几十年来一直在处理这类优化。

此外,如果函数可以内联(例如,编译器在编译使用该函数的代码时可以看到它的定义),大多数编译器将完全消除该函数,只需发出代码以添加传递的两个变量,并根据调用方的要求存储结果。

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

就我个人而言,我不会写这样的函数。在调用者中,编写c = a + b比编写c = addNumber(a, b)更容易,因此这样的函数对程序员(努力理解)或程序(性能等)都没有好处。你最好写一些没有提供有用信息的评论。

代码语言:javascript
复制
 c = a + b;    //   add a and b and store into c

任何有自尊心的代码审阅者都会对信息不足的功能或信息不足的评论提出尖锐的抱怨。

只有当它的名称为应用程序传递了一些特殊的含义(即不仅仅是添加两个值)时,我才会使用这样的函数

代码语言:javascript
复制
 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;
 }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39938660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档