main 函数执行前后
一直以为函数就是直接从main 函数开试运行,今天运行一个程序的时候发现有代码在打印字符串,注释掉main函数的所有代码后也无济于事。才发现原来程序里会 有部分代码是在main函数前运行的!! 那么是什么在“捣乱”呢?
上网搜索了一下, 这篇文章讲的比较详细。
一个典型程序的大致运行步骤
操作系统创建进程后,把控制权交到了程序入口,这个入口往往是程序运行库中的某个入口函数。
入口函数对运行库和程序运行环境进行初始化,包括堆、I/O、线程、全局变量的构造等等。
入口函数在完成初始化之后,调用main函数,正式开始执行函数主体部分。
main函数执行完毕之后,返回到入口函数,入口函数进行清理工作,包括全局变量析构、堆销毁、关闭I/O等,然后进行系统调用结束进程。
也就是程序在执行main函数之前,会先初始化,其中包括全局构造函数,main函数执行完成后,也会运行全局析构函数。
相关的部分代码是这样的,注意看注释:
a.cpp
REGISTER_MTCNN_CREATOR(tensorflow,tf_creator);
b.hpp
class only_for_auto_register
{
public:
//这个构造函数在main函数前运行了
only_for_auto_register(std::string name, mtcnn_factory::creator func)
{
cout<<"1"<<tensorflow<<endl; //这里打印了输出
if(func == NULL)
std::cout<<"func null\n";
mtcnn_factory::register_creator(name,func);
}
};
#define REGISTER_MTCNN_CREATOR(name,func) \
static only_for_auto_register __attribute__((used)) dummy_mtcnn_creator_## name (#name, func)
#endif