读书日记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,

 

 

 

全部评论

相关推荐

喜欢吃蛋糕仰泳鲈鱼是我的神:字节可以找个hr 给你挂了,再放池子捞
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务