通过两个副本返回值
Return value by two copies
我正在按函数分析返回值。请参阅下面的实际问题:
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
我的问题是什么?
- 为什么称为两个复制构造函数?我不明白为什么它是必要的
f()
内部的复制构造函数,因为使用了带有对象的"return"。这将提示它在一个临时变量中创建一个副本,然后将其传递给main
。main中的复制构造函数显然是f()
返回了一个S
对象,它被复制到"s
"
两次调用构造函数以构建用作f()
返回值的临时对象之一。如果你想避免这种额外的开销,你必须依赖C++11移动构造函数。
相关文章:
- 如何在C++中从两个单独的for循环中添加两个数组
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 如何返回一个类的两个对象相加的结果
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 两个字符串在 c++ 中不相等
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 两个文件使用彼此的功能-如何解决
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 如何确保在使用基于布尔值的两个方法之一调用方法时避免分支预测错误
- 停止cmake target_link_libraries将插件中静态库的两个对象文件链接到静态库本身
- 将fold表达式与std::一起用于两个元组
- 如何在C++中比较两个char数组
- 给定两个偶数,求出它们之间所有偶数的平方和
- 从同一类的两个不同模板副本继承时重载
- C++两个派生类的副本
- 通过两个副本返回值
- 这两个字符串副本 C/C++ 有什么区别
- C++-初始化由不同线程拥有的对象的两个副本