假设我们有两个函数:
int f();
int g();
我想得到 f() 和 g() 的和。
第一种方式:
int fRes = f();
int gRes = g();
int sum = fRes + gRes;
第二种方式:
int sum = f() + g();
这两种情况在性能上会有什么不同吗?
复杂类型而不是整数的相同问题
编辑
我是否理解正确,我不应该担心这种情况下的性能(在每种情况下,包括频繁执行的任务)并使用临时变量来提高可读性和简化代码?
您可以通过编译为汇编语言(当然要进行优化)并检查输出来自己回答此类问题。如果我将您的示例充实为一个完整的、可编译的程序...
extern int f();
extern int g();
int direct()
{
return f() + g();
}
int indirect()
{
int F = f();
int G = g();
return F + G;
}
并编译它( g++ -S -O2 -fomit-frame-pointer -fno-exceptions test.cc
;最后两个开关消除了输出中的一堆干扰),我明白了(删除了更多的干扰):
__Z8indirectv:
pushq %rbx
call __Z1fv
movl %eax, %ebx
call __Z1gv
addl %ebx, %eax
popq %rbx
ret
__Z6directv:
pushq %rbx
call __Z1fv
movl %eax, %ebx
call __Z1gv
addl %ebx, %eax
popq %rbx
ret
如您所见,为这两个函数生成的代码是相同的,因此您的问题的答案是否定的,不会有性能差异。现在让我们看看复数——相同的代码,但是 s/int/std::complex<double>/g
整个和#include <complex>
在顶部;相同的编译开关 --
__Z8indirectv:
subq $72, %rsp
call __Z1fv
movsd %xmm0, (%rsp)
movsd %xmm1, 8(%rsp)
movq (%rsp), %rax
movq %rax, 48(%rsp)
movq 8(%rsp), %rax
movq %rax, 56(%rsp)
call __Z1gv
movsd %xmm0, (%rsp)
movsd %xmm1, 8(%rsp)
movq (%rsp), %rax
movq %rax, 32(%rsp)
movq 8(%rsp), %rax
movq %rax, 40(%rsp)
movsd 48(%rsp), %xmm0
addsd 32(%rsp), %xmm0
movsd 56(%rsp), %xmm1
addsd 40(%rsp), %xmm1
addq $72, %rsp
ret
__Z6directv:
subq $72, %rsp
call __Z1gv
movsd %xmm0, (%rsp)
movsd %xmm1, 8(%rsp)
movq (%rsp), %rax
movq %rax, 32(%rsp)
movq 8(%rsp), %rax
movq %rax, 40(%rsp)
call __Z1fv
movsd %xmm0, (%rsp)
movsd %xmm1, 8(%rsp)
movq (%rsp), %rax
movq %rax, 48(%rsp)
movq 8(%rsp), %rax
movq %rax, 56(%rsp)
movsd 48(%rsp), %xmm0
addsd 32(%rsp), %xmm0
movsd 56(%rsp), %xmm1
addsd 40(%rsp), %xmm1
addq $72, %rsp
ret
指令多了很多,编译器没有做完美的优化工作,看起来,但尽管如此,为两个函数生成的代码是相同的。