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

来源:互联网 发布:java 异常处理机制5种 编辑:程序博客网 时间:2024/05/29 09:15


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

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


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


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

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


call __libc_init_firstcall _initcall atexitcall maincall _exit

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

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


0 0
原创粉丝点击