v -0x8(%rbp),%rax
1313: 8b 55 f4 mov -0xc(%rbp),%edx
1316: 89 10 mov %edx,(%rax)
1318: 48 8d 35 e6 0c 00 00 lea 0xce6(%rip),%rsi # 2005 <_ZStL19piecewise_construct+0x1>
131f: 48 8d 3d 1a 2d 00 00 lea 0x2d1a(%rip),%rdi # 4040 <_ZSt4cout@@GLIBCXX_3.4>
1326: e8 85 fd ff ff callq 10b0 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
132b: 48 89 c2 mov %rax,%rdx
132e: 48 8b 45 f8 mov -0x8(%rbp),%rax
1332: 8b 00 mov (%rax),%eax
1334: 89 c6 mov %eax,%esi
1336: 48 89 d7 mov %rdx,%rdi
1339: e8 b2 fd ff ff callq 10f0 <_ZNSolsEi@plt>
133e: 48 89 c2 mov %rax,%rdx
1341: 48 8b 05 88 2c 00 00 mov 0x2c88(%rip),%rax # 3fd0 <_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@GLIBCXX_3.4>
1348: 48 89 c6 mov %rax,%rsi
134b: 48 89 d7 mov %rdx,%rdi
134e: e8 6d fd ff ff callq 10c0 <_ZNSolsEPFRSoS_E@plt>
1353: 90 nop
1354: c9 leaveq
1355: c3 retq
析构函数:
0000000000001356 <_ZN6ObjectD1Ev>:
1356: f3 0f 1e fa endbr64
135a: 55 push %rbp
135b: 48 89 e5 mov %rsp,%rbp
135e: 48 83 ec 10 sub $0x10,%rsp
1362: 48 89 7d f8 mov %rdi,-0x8(%rbp)
1366: 48 8d 35 a1 0c 00 00 lea 0xca1(%rip),%rsi # 200e <_ZStL19piecewise_construct+0xa>
136d: 48 8d 3d cc 2c 00 00 lea 0x2ccc(%rip),%rdi # 4040 <_ZSt4cout@@GLIBCXX_3.4>
1374: e8 37 fd ff ff callq 10b0 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
1379: 48 89 c2 mov %rax,%rdx
137c: 48 8b 05 4d 2c 00 00 mov 0x2c4d(%rip),%rax # 3fd0 <_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@GLIBCXX_3.4>
1383: 48 89 c6 mov %rax,%rsi
1386: 48 89 d7 mov %rdx,%rdi
1389: e8 32 fd ff ff callq 10c0 <_ZNSolsEPFRSoS_E@plt>
138e: 90 nop
138f: c9 leaveq
1390: c3 retq
1391: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1)
1398: 00 00 00
139b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1)
全局对象的构造和析构
从上述代码可以看出,局部对象o2的构造和析构在main函数中。
那么全局对象o1和o3的构造和析构在哪呢?
我们发现存在名字为<_Z41__static_initialization_and_destruction_0ii>的汇编代码:
000000000000123c <_Z41__static_initialization_and_destruction_0ii>:
123c: f3 0f 1e fa endbr64
1240: 55 push %rbp
1241: 48 89 e5 mov %rsp,%rbp
1244: 48 83 ec 10 sub $0x10,%rsp
1248: 89 7d fc mov %edi,-0x4(%rbp)
124b: 89 75 f8 mov %esi,-0x8(%rbp)
124e: 83 7d fc 01 cmpl $0x1,-0x4(%rbp)
1252: 0f 85 88 00 00 00 jne 12e0 <_Z41__static_initialization_and_destruction_0ii+0xa4>
1258: 81 7d f8 ff ff 00 00 cmpl $0xffff,-0x8(%rbp)
125f: 75 7f jne 12e0 <_Z41__static_initialization_and_destruction_0ii+0xa4>
1261: 48 8d 3d f4 2e 00 00 lea 0x2ef4(%rip),%rdi # 415c <_ZStL8__ioinit>
1268: e8 73 fe ff ff callq 10e0 <_ZNSt8ios_base4InitC1Ev@plt>
126d: 48 8d 15 94 2d 00 00 lea 0x2d94(%rip),%rdx # 4008 <__dso_handle>
1274: 48 8d 35 e1 2e 00 00 lea 0x2ee1(%rip),%rsi # 415c <_ZStL8__ioinit>
127b: 48 8b 05 76 2d 00 00 mov 0x2d76(%rip),%rax # 3ff8 <_ZNSt8ios_base4InitD1Ev@GLIBCXX_3.4>
1282: 48 89 c7 mov %rax,%rdi
1285: e8 16 fe ff ff callq 10a0<__cxa_atexit@plt>
128a: be 01 00 00 00 mov $0x1,%esi
128f: 48 8d 3d be 2e 00 00 lea 0x2ebe(%rip),%rdi # 4154 <o1>
1296: e8 61 00 00 00 callq 12fc <_ZN6ObjectC1Ei>
129b: 48 8d 15 66 2d 00 00 lea 0x2d66(%rip),%rdx # 4008 <__dso_handle>
12a2: 48 8d 35 ab 2e 00 00 lea 0x2eab(%rip),%rsi # 4154 <o1>
12a9: 48 8d 3d a6 00 00 00 lea 0xa6(%rip),%rdi # 1356 <_ZN6ObjectD1Ev>
12b0: e8 eb fd ff ff callq 10a0<__cxa_atexit@plt>
12b5: be 03 00 00 00 mov $0x3,%esi
12ba: 48 8d 3d 97 2e 00 00 lea 0