g ++ __static_initialization_and_destruction_0(int,int) - 它是什么

时间:2010-03-12 17:21:16

标签: c++ constructor g++ destructor

编译c ++文件(使用全局静态对象)后,我进入nm输出此函数:

 00000000 t _Z41__static_initialization_and_destruction_0ii

 __static_initialization_and_destruction_0(int, int)  /* after c++filt */

这是什么?它会调用__cxa_atexit()

我可以禁用此函数的生成(并调用__cxa_atexit())并将所有构造函数和析构函数调用放到.ctors.dtors部分吗?

1 个答案:

答案 0 :(得分:14)

这个doc文件似乎告诉你所有你想知道的关于这些功能:http://www.nsnam.org/docs/linker-problems.doc

从我可以理解的是,gcc为每个需要调用静态构造函数的翻译单元创建__static_initialization_and_destruction_0。然后,它会将__do_global_ctors_aux放入.ctors部分,然后在每个翻译单元上调用__static_initialization_and_destruction_0

这个问题似乎比这复杂得多; gcc必须处理存档中的单个目标文件,我认为这是他们如何阻止链接器优化这些调用。