《深度探索C++对象模型》读书笔记[第六章:执行期语义学]

6.1 对象的构造和解构

一般而言,会把 object 尽可能放置在使用它的那个程序区段附近,这样做可以节省不必要的对象产生操作和摧毁操作.

6.1.1 全局对象

C++保证,一定会在 main()函数中第一次用到 全局对象之前,把它构造出来,而在 main() 函数结束之前把 它摧毁掉.
C++中所有的global objects 都被放置在程序的 data segment中,如果明确指定给它一个值,object将以该值为初值.否则object 所配置到的内存内容为0.

6.1.2 局部静态对象

第一次调用时才构造起来.

6.1.3 对象数组

如果有数组定义 Point knots[10] 。constructor和destructor会轮流施行于每一个元素之上.

6.1.4 Default Constructors 和数组

6.2 new 和 delete 运算符

new 一个对象分为两步:1.分配内存.2.调用构造函数
delete: 可以delete一个空指针,编译器已经做了防护,但是delete一个指针后需要主动置空,放置指针悬挂.

6.2.1 针对数组的 new 语义

delete []p_array; 删除数组内的所有元素. delete p_array,只删除第一个元素.

应该如何记录元素数目? 一个方法就是vec_new()所传回的每一个内存区块配置一个额外的word,然后把元素数目包藏在那个word之中.Jonathan和Sun编译器使用"联合数组(associative array)",放置指针及大小.

6.2.2 Placement Operator new 的语义

有一个预先定义好的重载的(overloaded)new 运算符,称为 placement operator new.它需要第二个参数,类型为 void*.调用方式如下:

Point2w *ptw = new(arena) Point2w;

Placement Operator new 的实现方式很简单,即只需要将"获得的指针"所指的地址传回即可:

void* operator new (size_t, void* p)
{
    return p;
}

不过,不同于指针转换,这里Placement Operator new 会将 Point2w constructor 自动实施与 arena 所指的地址上.这里才是关键.

一般而言,placement new operator 并不支持多态.

Point2w *arena = new Point2w;
Point2w *p2w = new (arena) Point3w;

Point3w 的 constructor 将会导致严重的破坏.

6.3 临时性对象

临时性对象的被摧毁,应该是对完整表达式求职过程中的最后一个步骤.该完整表达式造成临时对象的产生.

临时性对象在完整表达式尚未评估完全之前,不得被摧毁.
如果一个临时性对象被绑定于一个reference,对象将残留,直到被初始化之reference的声明结束,或直到临时对象的生命范畴结束,视哪一种情况先到达而定.

posted @ 2022-02-17 12:18  liyakai  阅读(26)  评论(0编辑  收藏  举报