c++返回性能
C++ Return Performance
我有一个关于性能的问题。我认为这也适用于其他语言(不仅仅是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;
}
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 什么时候在C++中返回常量引用是个好主意
- 你能重载对象变量名本身返回的内容吗
- 隐式转换函数的返回对象时是否会影响性能?
- C++14 通过引用返回一个值以优化性能
- 性能:否则如果 vs if 在已经返回的函数中
- 从交换机块返回时的任何性能差异
- 在C 性能问题中使用Getter返回地图
- 返回本地静态的函数和返回静态成员的函数之间有什么区别(对象大小、性能等)?
- 检查从查询返回的任何行是否包含在字符串中的最高性能方法?
- 用户定义功能的返回值的分配:性能
- 通过将返回值绑定到const引用,C++性能得到改善
- 重载运算符:常量与非常量返回类型:任何性能差异
- 返回间接类型化对象是否会影响性能
- 如果我不关心返回值,我是否会遇到性能问题
- 可以使用 char[] 作为参数、返回等来解决任何性能问题
- c++中的多个返回语句和性能
- c++返回性能
- 有没有办法在不使用new的情况下从函数返回抽象(出于性能原因)