C++全局变量构造函数的调用

C++全局变量的构造函数不总在main函数中调用,而是在一个称为init的代码段中,这一过程发生在Linux ELF可执行文件加载且在调用main函数之前。同时,初始化期间会注册全局析构函数,利用atexit确保在程序结束时按正确顺序执行析构函数。
摘要由CSDN通过智能技术生成


C++是不能在全局Scope里写表达式, 原来一直以为指令的执行都是在main函数里的. 但C++里可以调用类的构造函数对类初始化. 构造函数显然不能是在main函数里调用, 那在什么时候调用呢? 

是在一段叫做init的代码段里.


Linux的ELF可执行文件格式分为若干段:


ELF可执行文件格式
ELF Header
Segment header table
.init        初始化段
.text       代码段
.rodata  只读数据(常量等)
.data     可读写数据(全局变量等)
.bss       未初始化数据    
.symtab  符号表(似乎只有全局的吧)
.debug    调试信息
.line        指令和源文件行对应
.strtab     符号字符串实际存放处
Section Header Table

在可执行程序载入时, 在调用main函数之前, 会依次调用其他东西:


call __libc_init_first
call _init
call atexit
call main
call _exit

而全局变量的初始化代码, 就是在init段里的.

另外,  在调用全局构造函数的时候, 还会顺便调用atexit把需要在结束时调用的全局析构函数安装上. 由于atexit允许安装多个函数(按安装的反序执行). 所以不会跟ELF载入时在main前面调用的那次atexit冲突.


  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值