c++ - C++中的临时变量和性能

标签 c++

<分区>

假设我们有两个函数:

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

指令多了很多,编译器没有做完美的优化工作,看起来,但尽管如此,为两个函数生成的代码是相同的。

关于c++ - C++中的临时变量和性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5071890/

相关文章:

c++ - 如何查找和读取二进制文件?

c++ - Xcode 错误编译 C++ 预期成员名称或声明说明符后的 ';'

c++ - 卡在遗留 C++ IO 库和标准化 IO 库之间

c++ - 将操作码添加到现有二进制文件需要什么?

c++ - push_back 期间的 std::vector 段错误

c++ - 为什么我的析构函数没有被调用?

c++ - 由于对象的使用方式,我担心这段代码没有按照我想要的方式执行

c++ - 唯一锁和条件变量 - 显式调用解锁

c++ - 有什么方法可以在 C++ 中的某个地址获取指令的总字节数?

c++ - 多个凸形角连接