《深度探索C++对象模型》读书笔记(6)

《深度探索C++对象模型》读书笔记(6)。

  ***对象的构造和解构***

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

   ***全局对象***

   全局对象的静态初始化策略包括以下几个步骤:

   (1)为每一个需要静态初始化的对象产生一个_sti_……()函数,内含必要的constructor调用操作或inline expansions;

   (2)为每一个需要静态的内存释放操作的对象产生一个_std_……()函数,内含必要的destructor调用操作或inline expansions;

   (3)在main()函数的首尾分别添加一个_main()函数(用以调用可执行文件中的所有_sti()函数)和一个_exit()函数(用以调用可执行文件中的所有_std()函数)。

   建议根本不要用那些需要静态初始化的全局对象。

   ***局部静态对象***

   假设我们有以下程序片段:

 const Matrix& identity() {
static Matrix mat_identity;
// ...
return mat_identity;
}

   此处的local static class object保证了以下语意:

   (a)mat_identity的constructor必须只能施行一次,虽然上述函数可能会被调用多次;

   (b)mat_identity的destructor必须只能施行一次,虽然上述函数可能会被调用多次。

   编译器的实际做法如下:在第一次调用identity()时把mat_identity构造出来,而在与相应文件关联的静态内存释放函数中将其解构。(局部静态对象的地址在downstream component中将会被转换到程序内用来放置global object的data segment中)

   ***对象数组***

   如果你想要在程序中取出一个constructor的地址,这是不可以的。然而经由一个指针来激活constructor,将无法存取default argument values.那么,如何支持以下的语句:

 complex::complex(double=0.0, double=0.0);

   当程序员写出:

 complex c_array[10];

   时,编译器最终需要调用:

 vec_new(&c_array,sizeof(complex),10,&complex::complex,0);

   为了解决这个问题,可由编译器产生一个内部的constructor,没有参数,在其函数内调用由程序员提供的constructor,并将default参数值明确地指定过去:

 complex::complex()
{
complex(0.0, 0.0);
}

   ***new和delete运算符***

   以constructor来配置一个class object:

     Point3d *origin = new Point3d;

   被转换为:

 Point3d *origin;
if(origin = _new(sizeof(Point3d))){
try {
origin = Point3d::Point3d(origin);
}
catch( ... ) {
_delete(origin);  // 释放因new而配置的内存
throw;  // 将原来的exception上传
}
}

   如果我们配置一个数组,内带10个Point3d objects,我们预期Point和Point3d的constructor被调用各10次,每次作用于数组中的一个元素:

 // 完全不是好主意
Point *ptr = new Point3d[10];

   如果我们进行如下的释放操作:

 // 只有Point::~Point被调用
delete []ptr;

   由于其触发的vec_delete()是通过迭代走过每一个数组元素,而本例中被传递过去的是Point class object的大小而不是Point3d class object的大小,整个运行过程将会失败。

   解决之道在于程序层面,而非语言层面:

 for(int ix = 0; ix < 10; ix++)
{
Point3d *p = &((Point3d*)ptr)[ix];
delete p;
}

   当然,最好还是避免以一个base class指针指向一个derived class objects所组成的数组。

  系列文章:

  《深度探索C++对象模型》读书笔记(1)

  《深度探索C++对象模型》读书笔记(2)

  《深度探索C++对象模型》读书笔记(3)

  《深度探索C++对象模型》读书笔记(4)

  《深度探索C++对象模型》读书笔记(5)

  《深度探索C++对象模型》读书笔记(7)

  《深度探索C++对象模型》读书笔记 最后一记

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值