main函数的生前死后

main函数执行之前和之后都做了什么?

我们都知道程序的执行是从main函数开始的,main函数是用户定义的执行入口点,但是在main函数之前和main函数之后编译器都做了什么工作呢?

1.main函数执行之前

  • 设置栈指针
  • 初始化static静态变量和global全局变量,即.data段的内容
  • 对.bss段的未初始化的静态变量和全局变量进行赋初值,数值型short,int,long等为赋为0,bool类型为FALSE,指针为NULL等
  • 初始化堆
  • 执行全局对象的初始化
  • 将main函数的argc和argv参数传递给main函数,然后才开始真正运行main函数。

2.main函数之后则执行与之前相反的步骤

3.如如何在main函数之前或者之后做一些操作

(1)linux环境下利用gcc的__attribute关键字:

#include<stdio.h>

__attribute((destructor)) void befor_main() {
	printf("before main\n");
}

__attribute((constructor)) void befor_main() {
	printf("after main\n");
}

int main(){
  printf("main\n");
  return 0;
}

(2)window平台下

#include <stdio.h>

void before_main()
{
    printf("before main!\n");
    return 0;
}

typedef int func();

#pragma data_seg(".CRT$XIU")
static func *before[] = { before_main };
#pragma data_seg()


int main()
{
    printf("main\n");
    return 0;
}

(3) C++下利用全局对象的构造与析构

#include<iostream>
using namespace std;

class A {
public:
	A() {
		cout << "before main" << endl;
	}
	~A() {
		cout << "after main" << endl;
	}
};

A a;

int main() {

	cout << "main" << endl;
	return 0;
}

main函数的生前死后

上一篇:Spring Security注解@PreAuthorize与AOP切面执行顺序


下一篇:Css 伪元素