读书日记2012/2/12——C++对象的构造与析构(编译器做的那些事)
今天又漫无目的过了一天,上午睡了一上午,起来都十点多了,去图书馆随便逛逛借了几本书,然后吃了个饭,来到教研室。
时间是最坏的东西,往往在你不经意间流逝。说这句话时,已经是今天的尾声了。下午随便看了点书,现在利用这点时间,把今天看的东西总结一下。
我们写的C++程序,在编译器编译时,编译器不仅判断我们写的程序的语法等错误,也对我们的程序本身进行改写,使之更好地执行。
在程序中,一般而言,constructor和destructor的安插都如你所预期。
Point point;
//point.Point::Point() 一般而言会被安插在这里
。。。。。。
//point.Point::~Point()
如果一个区段或函数中有一个以上的离开点,destuctor必须被放在每一个离开点(当时object还存活)之前。
一.全局对象
1.C++程序中所有的global objects 都被放置在程序的data segment 中,如果明确指定给它一个值,object将以该值为初值,否则object所配置到的内存内容为0.
2.class object在编译时期可以被放置于data segment中并且内容为0,但constructor一直要到程序激活时才会实施,必须对一个“放置于program data segment 中的 object 的初始化表达式”做评估。
静态初始化方法
(1)为每一个需要静态初始化的档案产生一个_sit()函数,内带必要的constructor 调用操作或inline expansions.
(2) 类似情况,在每一个需要静态的内存释放操作的文件中,产生一个_std()函数,内带必要的destructor调用操作,或是其inline expansions.
(3)提供一组 runtime library “munch”函数:一个_main()函数(用以调用可执行文件中得所有_sit()函数),以及一个eixt()函数(以类似方式调用所有的_std()函数)。
二.局部静态对象
1.局部静态对象的constructor必须只能施行一次
2.局部静态对象的destructor必须只能施行一次
3.过程
先设置一个临时对象并置为false-------->当第一次处理局部静态对象时,constructor并且把临时对象改为true-------->程序处理-------->destructor-------->调用关联的静态内存释放函数。
三.对象数组
定义如下:
Point knots[10];
编译器改为:
Point knots[10];
vec_new( &knots,sizeof(Point),10,&Point::Point ,0);
vec_new()如下:
void* vec_new( void *array, size_t elem_size, int elem_count,