编译期初始化:在源代码被编译过程中,编译期安插一些代码逻辑,完成确定的内存分配(并非实际分配内存,而是确定其大小占用,由编译期安插代码),变量的初始化。
如:全局变量为内置类型,并且大小确定
int a=2;
static int b=3; //static的不同只是其只在本文件中可见
static int c=a+b;
在编译期初始化,那么在实际运行期都是确定的结构和逻辑,将带来更高的性能,因为编译器完成了一定的工作。
加载时初始化:在main()函数执行前,完成包括全局变量,静态变量的初始化:
例如全局的类对象:
class A
{
public:
virtual void fun()
{
cout<<"funciton A:fun() call"<<endl;
}
};
A a;//将在main执行前,加载时初始化
int main()
{
......
全局类对象在main函数执行前,由加载程序完成其初始化,其无法在编译期初始化,由于那时候还无法调用类的构造函数。
同时,在加载期,是线程安全的。例如,饿汉方式的单例类:
借助main执行前的加载期完成