深度探索C++对象模型___小张大肝第六章 11月8号

6.1 对象的构造和析构

全局对象

  • C++程序中所有的全局对象都被放置在数据段,如果显示的指定给他一个值,此对象将以该值为初值,否则对象所配置到的内存内容为0.

  • 全局对象的构造函数一直要到程序启动时才会实施,所以一个对象需要静态初始化。

  • munch策略

  • 为每一个需要静态初始化的文件产生一个_sit()函数,内含必要的构造函数调用操作或inline expansions

  • 在每一个需要静态内存释放操作的文件中,产生一个_std()函数内涵必要的析构函数调用操作或是其inline expansions

  • 提供一组runtime library "munch"函数:一个_main()函数, 用以调用可执行文件中所有的_sit()函数,以及一个exit()函数,调用所有的_std()函数。

  • 如何收集各个文件对象中的_sti()函数 和 _std()函数

  • 使用nm命令 :一个可执行文件,是由.o文件产生出来的,nm将施行于可执行文件身上。其输出被导入munch程序中。munch程序会用力咀嚼符号表格中的名称,搜寻以_sti 或 _ std开头的名称,然后把函数加到一个跳离表格中。接下来把这个表格写到一个小的program text文件中。然后CC命令被重新激活,将这个内含表格的文件加以编译,整个可执行文件然后被重新链接。_main()和exit()于是在各个表格上走访一遍,轮流调用每个项目。

  • 以一个派生类的指针或引用,来存取虚基类子对象是一种nonconstant expression,必须在执行期才能加以评估。因为虚基类的子对象在派生类中的位置可能发生变化。

  • 静态初始化objects的缺点

  • 如果exception handing 被支持,那些对象将不能被放置于try区段之内

  • 为了控制需要跨模块做静态初始化的对象的相依顺序。

局部静态对象

  • 虽然函数有可能会被调用多次,但是局部静态对象的构造函数和析构函数只会执行一次,在函数被调用时被构造起来。
  • 做法:
    • 导入一个临时性对象。

对象数组

  • vec_new() 和 vec_vnew()

Default Constrctors 和 数组

  • 经由一个指针来启动constructor 将无法(不被允许)存取default argument values
  • 产生一个stub constructor 没有参数,在其函数内调用由程序员提供的constructor。

6.2 new 和 delete 运算符

  • 运算符new的两个步骤

  • 通过适当的new运算符实例,配置所需的内存

  • 将配置得来的对象设立初值

  • new运算符实际上总是以标准的C malloc()完成,delete运算符也总是以标准的C free()完成。

针对数组的new 语义

  • delete运算符:只有在中括号出现时,编译器才会去寻找数组的维度,否则它便假设只有单独一个对象要被删除。
  • 记录元素的个数:为vec_new()所传回的每一个内存块配置一个额外的word,然后把元素个数包藏在那个word中。
  • 基于数组身上的destructor,是根据交给vec_delete()函数的被删除指针类型的析构,此外每一个元素的大小也一并被传递过去。
  • 避免以一个基类的指针指向一个派生类对象所组成的数组。

Placement Operator new 的语义

  • Placement Operator new只要将获得的指针类型所指的地址传回即可
  • 所扩充的另一半是将对象的构造函数实施于指针所指的地址上。
  • 如果Placement Operator 在原先已存在一个对象上构造新的对象,而该既存的对象有个析构函数,这个析构函数必须要通过Placement Operator delete调用。Placement Operator delete会对对象实施析构函数,但不释放内存。
  • Placement new operator 并不支持多态,被交给new的指针,应该适当的指向一块预先配置好的内存。

6.3 临时性对象

  • 直接传递目标对象到运算符函数中都是有问题的,由于运算符函数并不为其外加参数调用一个析构函数(它期望一块新鲜的内存),所以必须在此之前先调用析构函数。
  • 临时性对象被摧毁,应该是对完整表达式求值过程中的最后一个步骤,该完整表达式造成临时对象的产生。
  • 某些形式的条件测试现在必须被按插进来,以决定是否要摧毁和第二算式有关的临时对象。
  • 临时性对象的两个列外:
    • 表达式被用来初始化一个对象时:凡持有表达式执行结果的临时性对象,应该存留到对象的初始化操作完成。
    • 当一个临时性对象被引用绑定时:如果一个临时性对象被绑定于一个引用中,对象将残留,直到被初始化之引用的生命结束或到临时对象的生命范畴结束。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值