通过两个副本返回值

Return value by two copies

本文关键字:两个 副本 返回值      更新时间:2023-10-16

我正在按函数分析返回值。请参阅下面的实际问题:

struct S{ int a, b, c, d;  };
S f(){
 S s;
 s.b=5;
 return s;
}
int main(){
  S s= f(); 
  s.a =2;
}

godbolt:上gcc 5.3 -O0 -fno-elide-constructors的编译器输出

f():
        pushq   %rbp
        movq    %rsp, %rbp
        subq    $32, %rsp
        movl    $5, -28(%rbp)
        leaq    -32(%rbp), %rdx
        leaq    -16(%rbp), %rax
        movq    %rdx, %rsi
        movq    %rax, %rdi
        call    S::S(S const&)
        movq    -16(%rbp), %rax
        movq    -8(%rbp), %rdx
        leave
        ret
main:
        pushq   %rbp
        movq    %rsp, %rbp
        subq    $32, %rsp
        call    f()
        movq    %rax, -16(%rbp)
        movq    %rdx, -8(%rbp)
        leaq    -16(%rbp), %rdx
        leaq    -32(%rbp), %rax
        movq    %rdx, %rsi
        movq    %rax, %rdi
        call    S::S(S const&)
        movl    $2, -32(%rbp)
        movl    $0, %eax
        leave
        ret

我的问题是什么?

  1. 为什么称为两个复制构造函数?我不明白为什么它是必要的
调用f()内部的复制构造函数,因为使用了带有对象的"return"。这将提示它在一个临时变量中创建一个副本,然后将其传递给main。main中的复制构造函数显然是f()返回了一个S对象,它被复制到"s"

两次调用构造函数以构建用作f()返回值的临时对象之一。如果你想避免这种额外的开销,你必须依赖C++11移动构造函数。