C++是不能在全局Scope里写表达式, 原来一直以为指令的执行都是在main函数里的. 但C++里可以调用类的构造函数对类初始化. 构造函数显然不能是在main函数里调用, 那在什么时候调用呢?
是在一段叫做init的代码段里.
Linux的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冲突.

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

1631

被折叠的 条评论
为什么被折叠?



