vam*_*shi 4 assembly constructor destructor
以下是C++源代码.该代码具有HumanBeing类以及Display和verify函数.每个函数都打印语句.
#include <iostream>
using namespace std;
class HumanBeing {
public:
void display() {
cout << "hello aam a human being" << endl;
}
void print() {
cout << "verify print" << endl;
}
};
int main() {
HumanBeing vamshi;
vamshi.display();
vamshi.print();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是上述c ++代码的相应汇编代码
.file "verify.cpp"
.local _ZStL8__ioinit
.comm _ZStL8__ioinit,1,1
.section .rodata
.LC0:
.string "hello aam a human being"
.section .text._ZN10HumanBeing7displayEv,"axG",@progbits,_ZN10HumanBeing7displayEv,comdat
.align 2
.weak _ZN10HumanBeing7displayEv
.type _ZN10HumanBeing7displayEv, @function
_ZN10HumanBeing7displayEv:
.LFB971:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $16, %rsp
movq %rdi, -8(%rbp)
movl $.LC0, %esi
movl $_ZSt4cout, %edi
call _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc
movl $_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_, %esi
movq %rax, %rdi
call _ZNSolsEPFRSoS_E
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE971:
.size _ZN10HumanBeing7displayEv, .-_ZN10HumanBeing7displayEv
.section .rodata
.LC1:
.string "verify print"
.section .text._ZN10HumanBeing5printEv,"axG",@progbits,_ZN10HumanBeing5printEv,comdat
.align 2
.weak _ZN10HumanBeing5printEv
.type _ZN10HumanBeing5printEv, @function
_ZN10HumanBeing5printEv:
.LFB972:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $16, %rsp
movq %rdi, -8(%rbp)
movl $.LC1, %esi
movl $_ZSt4cout, %edi
call _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc
movl $_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_, %esi
movq %rax, %rdi
call _ZNSolsEPFRSoS_E
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE972:
.size _ZN10HumanBeing5printEv, .-_ZN10HumanBeing5printEv
.text
.globl main
.type main, @function
main:
.LFB973:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $16, %rsp
leaq -1(%rbp), %rax
movq %rax, %rdi
call _ZN10HumanBeing7displayEv
leaq -1(%rbp), %rax
movq %rax, %rdi
call _ZN10HumanBeing5printEv
movl $0, %eax
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE973:
.size main, .-main
.type _Z41__static_initialization_and_destruction_0ii, @function
_Z41__static_initialization_and_destruction_0ii:
.LFB982:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $16, %rsp
movl %edi, -4(%rbp)
movl %esi, -8(%rbp)
cmpl $1, -4(%rbp)
jne .L5
cmpl $65535, -8(%rbp)
jne .L5
movl $_ZStL8__ioinit, %edi
call _ZNSt8ios_base4InitC1Ev
movl $__dso_handle, %edx
movl $_ZStL8__ioinit, %esi
movl $_ZNSt8ios_base4InitD1Ev, %edi
call __cxa_atexit
.L5:
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE982:
.size _Z41__static_initialization_and_destruction_0ii, .-_Z41__static_initialization_and_destruction_0ii
.type _GLOBAL__sub_I_main, @function
_GLOBAL__sub_I_main:
.LFB983:
.cfi_startproc
Run Code Online (Sandbox Code Playgroud)
在这段代码中,我有以下疑问:
1.static_initialization_and_destruction - 似乎是功能,但它的确切工作尚不清楚
任何人都可以在GLOBAL__sub_I_main函数的代码和目的中清楚地解释构造函数和析构函数的工作和组织吗?
gcc在C++中使用这两个函数用于任何具有静态存储持续时间的实例化类,需要在main之前构造
class A {
A();
~A();
...
};
A a;
// "a" will need to be constructed before main
int main()
{
return a.Foo();
}
// "a" will need to be destructed after main
Run Code Online (Sandbox Code Playgroud)
生成的_Z41__static_initialization_and_destruction_0ii函数(demangled __static_initialization_and_destruction_0(int, int))有两个目的:
_GLOBAL__sub_I_main是一个简单的包装函数,它的函数指针被添加到该.init_array部分.在编译多个源文件时,每个单独的目标文件都会向其中添加初始化函数,.init_array并且在调用之前将调用所有这些函数main.
虽然这可能不会立即明显,但您的代码包含具有静态存储持续时间的实例.在<iostream>头文件中声明的std ::的ios_base ::初始化它需要构建尽早使其安全地访问I/O在构造函数和静态对象的析构函数流标准.