C++对象构造和析构
//遗留的问题:C++中构造函数和析构函数的执行顺序到底是怎么样的呢?
class Object
{
private:
int val;
public:
Object(int x)
{
val = x;
cout << "create :" << val << endl;
}
};
Object o1(1);
int main()
{
Object o2(2);
}
Object o3(3);
代码在Linux64平台编译运行,objdump -d 生成反汇编代码
。
汇编代码如下:
反汇编代码
Object: 文件格式 elf64-x86-64
Disassembly of section .init:
0000000000001000 <_init>:
1000: f3 0f 1e fa endbr64
1004: 48 83 ec 08 sub $0x8,%rsp
1008: 48 8b 05 d9 2f 00 00 mov 0x2fd9(%rip),%rax # 3fe8 <__gmon_start__>
100f: 48 85 c0 test %rax,%rax
1012: 74 02 je 1016 <_init+0x16>
1014: ff d0 callq *%rax
1016: 48 83 c4 08 add $0x8,%rsp
101a: c3 retq
Disassembly of section .plt:
0000000000001020 <.plt>:
1020: ff 35 62 2f 00 00 pushq 0x2f62(%rip) # 3f88 <_GLOBAL_OFFSET_TABLE_+0x8>
1026: f2 ff 25 63 2f 00 00 bnd jmpq *0x2f63(%rip) # 3f90 <_GLOBAL_OFFSET_TABLE_+0x10>
102d: 0f 1f 00 nopl (%rax)
1030: f3 0f 1e fa endbr64
1034: 68 00 00 00 00 pushq $0x0
1039: f2 e9 e1 ff ff ff bnd jmpq 1020 <.plt>
103f: 90 nop
1040: f3 0f 1e fa endbr64
1044: 68 01 00 00 00 pushq $0x1
1049: f2 e9 d1 ff ff ff bnd jmpq 1020 <.plt>
104f: 90 nop
1050: f3 0f 1e fa endbr64
1054: 68 02 00 00 00 pushq $0x2
1059: f2 e9 c1 ff ff ff bnd jmpq 1020 <.plt>
105f: 90 nop
1060: f3 0f 1e fa endbr64
1064: 68 03 00 00 00 pushq $0x3
1069: f2 e9 b1 ff ff ff bnd jmpq 1020 <.plt>
106f: 90 nop
1070: f3 0f 1e fa endbr64
1074: 68 04 00 00 00 pushq $0x4
1079: f2 e9 a1 ff ff ff bnd jmpq 1020 <.plt>
107f: 90 nop
1080: f3 0f 1e fa endbr64
1084: 68 05 00 00 00 pushq $0x5
1089: f2 e9 91 ff ff ff bnd jmpq 1020 <.plt>
108f: 90 nop
Disassembly of section .plt.got:
0000000000001090 <__cxa_finalize@plt>:
1090: f3 0f 1e fa endbr64
1094: f2 ff 25 2d 2f 00 00 bnd jmpq *0x2f2d(%rip) # 3fc8 <__cxa_finalize@GLIBC_2.2.5>
109b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1)
Disassembly of section .plt.sec:
00000000000010a0 <__cxa_atexit@plt>:
10a0: f3 0f 1e fa endbr64
10a4: f2 ff 25 ed 2e 00 00 bnd jmpq *0x2eed(%rip) # 3f98 <__cxa_atexit@GLIBC_2.2.5>
10ab: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1)
00000000000010b0 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>:
10b0: f3 0f 1e fa endbr64
10b4: f2 ff 25 e5 2e 00 00 bnd jmpq *0x2ee5(%rip) # 3fa0 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@GLIBCXX_3.4>
10bb: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1)
00000000000010c0 <_ZNSolsEPFRSoS_E@plt>:
10c0: f3 0f 1e fa endbr64
10c4: f2 ff 25 dd 2e 00 00 bnd jmpq *0x2edd(%rip) # 3fa8 <_ZNSolsEPFRSoS_E@GLIBCXX_3.4>
10cb: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1)
00000000000010d0 <__stack_chk_fail@plt>:
10d0: f3 0f 1e fa endbr64
10d4: f2 ff 25 d5 2e 00 00 bnd jmpq *0x2ed5(%rip) # 3fb0 <__stack_chk_fail@GLIBC_2.4>
10db: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1)
00000000000010e0 <_ZNSt8ios_base4InitC1Ev@plt>:
10e0: f3 0f 1e fa endbr64
10e4: f2 ff 25 cd 2e 00 00 bnd jmpq *0x2ecd(%rip) # 3fb8 <_ZNSt8ios_base4InitC1Ev@GLIBCXX_3.4>
10eb: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1)
00000000000010f0 <_ZNSolsEi@plt>:
10f0: f3 0f 1e fa endbr64
10f4: f2 ff 25 c5 2e 00 00 bnd jmpq *0x2ec5(%rip) # 3fc0 <_ZNSolsEi@GLIBCXX_3.4>
10fb: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1)
Disassembly of section .text:
0000000000001100 <_start>:
1100: f3 0f 1e fa endbr64
1104: 31 ed xor %ebp,%ebp
1106: 49 89 d1 mov %rdx,%r9
1109: 5e pop %rsi
110a: 48 89 e2 mov %rsp,%rdx