[root@localhost test]# make
g++ test.cpp -std=c++11 -g
gdb ./a.out -q -ex 'break main' -ex 'r' -ex 'disassemble main' -ex 'c' -ex '!cat test.cpp'
Reading symbols from /root/cppfile/test/a.out...done.
Breakpoint 1 at 0x400a86: file test.cpp, line 27.
Starting program: /root/cppfile/test/./a.out
Breakpoint 1, main () at test.cpp:27
27 T a;
Dump of assembler code for function main():
0x0000000000400a7d <+0>: push %rbp
0x0000000000400a7e <+1>: mov %rsp,%rbp
0x0000000000400a81 <+4>: push %rbx
0x0000000000400a82 <+5>: sub $0x48,%rsp
=> 0x0000000000400a86 <+9>: lea -0x30(%rbp),%rax
0x0000000000400a8a <+13>: mov %rax,%rdi
0x0000000000400a8d <+16>: callq 0x400b9e <T::T()>
0x0000000000400a92 <+21>: lea -0x50(%rbp),%rax
0x0000000000400a96 <+25>: mov %rax,%rdi
0x0000000000400a99 <+28>: callq 0x400b9e <T::T()>
0x0000000000400a9e <+33>: lea -0x50(%rbp),%rax
0x0000000000400aa2 <+37>: mov %rax,%rdi
0x0000000000400aa5 <+40>: callq 0x400c40 <std::move<T&>(T&)>
0x0000000000400aaa <+45>: mov %rax,%rdx
0x0000000000400aad <+48>: lea -0x30(%rbp),%rax
0x0000000000400ab1 <+52>: mov %rdx,%rsi
0x0000000000400ab4 <+55>: mov %rax,%rdi
0x0000000000400ab7 <+58>: callq 0x400c4e <T::operator=(T&&)>
0x0000000000400abc <+63>: mov $0x0,%ebx
0x0000000000400ac1 <+68>: lea -0x50(%rbp),%rax
0x0000000000400ac5 <+72>: mov %rax,%rdi
0x0000000000400ac8 <+75>: callq 0x400c12 <T::~T()>
0x0000000000400acd <+80>: lea -0x30(%rbp),%rax
0x0000000000400ad1 <+84>: mov %rax,%rdi
0x0000000000400ad4 <+87>: callq 0x400c12 <T::~T()>
0x0000000000400ad9 <+92>: mov %ebx,%eax
0x0000000000400adb <+94>: jmp 0x400b03 <main()+134>
0x0000000000400add <+96>: mov %rax,%rbx
0x0000000000400ae0 <+99>: lea -0x50(%rbp),%rax
0x0000000000400ae4 <+103>: mov %rax,%rdi
0x0000000000400ae7 <+106>: callq 0x400c12 <T::~T()>
0x0000000000400aec <+111>: lea -0x30(%rbp),%rax
0x0000000000400af0 <+115>: mov %rax,%rdi
0x0000000000400af3 <+118>: callq 0x400c12 <T::~T()>
0x0000000000400af8 <+123>: mov %rbx,%rax
0x0000000000400afb <+126>: mov %rax,%rdi
0x0000000000400afe <+129>: callq 0x400980 <_Unwind_Resume@plt>
0x0000000000400b03 <+134>: add $0x48,%rsp
0x0000000000400b07 <+138>: pop %rbx
0x0000000000400b08 <+139>: pop %rbp
0x0000000000400b09 <+140>: retq
End of assembler dump.
Continuing.
copy assign
[Inferior 1 (process 11575) exited normally]
#include<string>
#include<iostream>
class D {
public:
D(){}
~D(){}
D(D&&){}
D(const D&){}
D& operator=(const D&){
std::cout << "copy assign" << std::endl;
}
};
class T {
public:
int a;
int b;
std::string c{"122345"};
D d;
T(){}
T(const T&){}
T& operator=(T&&)=default;
};
int main() {
T a;
T b;
a = std::move(b);
return 0;
}
-
可以根据输出看到,使用的std::move
,但是匹配的是拷贝赋值,因为没有实现移动赋值函数.
-
这就是memberwise moves
。
-
注意: 这里没有D
没有自动生成移动赋值.