Welcome

首页 / 软件开发 / C++ / 《深度探索C++对象模型》读书笔记(6)

《深度探索C++对象模型》读书笔记(6)2010-01-05 blog.csdn.net arthurkingios***对象的构造和解构***

一般而言,我们会把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);
}