码迷,mamicode.com
首页 > 编程语言 > 详细

【C++】深度探索C++对象模型读书笔记--执行期语意学(Runtime Semantics)

时间:2015-07-20 09:13:40      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:

对象的构造和析构:

  全局对象

  C++程序中所有的global objects都被放置在程序的data segment中。如果显式指定给它一个值,此object将以此值为初值。否则object所配置到的内容为0。

  如果全局对象如果有构造函数或析构函数的话,我们说它需要静态的初始化操作和内存释放操作。编译器的执行步骤如下:

  1.为每一个需要静态初始化的文件产生一个_sti()函数,内含必要的构造函数调用操作。

  2. 在每一个需要静态的内存释放操作的文件中,产生一个_std()函数,内含必要的析构操作。  

  3.在main函数中安插_main()函数(用以调用执行文件中所有的_sti()函数),以及一个exit()函数(用以调用所有的_std()函数)。

  技术分享

 

  对象数组:

  假设我们有下列数组定义:  

Point knots[10];

  如果Point既没有定义一个constructor,也没有定义一个destructor,那么我们的工作不会比建立一个“内建(built-in)类型所组成的数组”更多,也就是说我们只需要配置足够内存以存储10个连续的Point元素即可。

  如果Point的确定义了一个default constructor,所以这个desturctor必须轮流试行于每一个元素之上。一般而言这是经由一个或多个runtime library函数达成的。

  如果Point也定义了一个destructor,当knots生命结束时,该destructor也必须试行于那10个Point元素身上。、

  如果程序员提供一个或多个明显初值给一个由class objects组成的数组,像下面这样,会如何:

Point knots[10] = {
    Point();
    Point(1.0, 1.0, 0.5),
    -1.0
};

  对于那些明显获得初值的元素,编译器无需做初始化操作。对于那些没有初始化的对象,编译器仍然需要调用库函数进行初始化。也就是说上面这个定义的后7个对象被编译器产生的代码初始化。

  

new和delete运算符:

  运算符new的运用,看起来似乎是一个单一运算,像这样:

int *pi = new int(5);

  但事实上它是由两个步骤完成的:

  1. 通过适当的new运算符函数实例,配置所需的内存:

//调用库函数中的new运算符
int *pi = _new(sizeof(int));

  2. 将配置而来的对象设立初值:  

*pi = 5;

 

  针对数组的new语意:

  如果我们定义了一个数组:

Point *p_array = new Point3d[array_size];

  则在删除的时候必须调用delete []p_array。因为只有中括号出现时,编译器才寻找数组的维度,否则它便假设只有单独一个objects要被删除。如果程序员没有提供必须的中括号,像这样:

  delete p_array;

  那么就和自由第一个元素会被析构。其他的元素仍然存在--虽然其相关的内存已经被要求归还了。

  不要将一个基类指针指向一个继承类对象的数组。

  

【C++】深度探索C++对象模型读书笔记--执行期语意学(Runtime Semantics)

标签:

原文地址:http://www.cnblogs.com/vincently/p/4657334.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!