深度探索C++对象模型 个人总结 第六章 执行期语意学
执行期语意学
6.1对象的构造和析构
把object尽可能放在使用它的那个程序区段附近,这么做可以节省非必要的对象产生操作和摧毁操作
全局对象
相比C,C++会把所有的global objects都放置在程序的data segment中,如果显式指定一个值,该object将以该值为初值,否则置为0(C不自动设定初值),但claas object的constructor一直要到程序启动时才会实施,这是因为C++只保证一定会在main()函数第一次用到identity之前把identity构造出来,而在main函数结束之前吧identity摧毁掉。
1.为每一个需要静态初始化的文件产生一个_sit()函数
2.在每一个需要静态的内存释放操作的文件中,产生一个_std()函数
3.提供一组runtime library“much”函数:一个_main()函数(用以调用可执行文件中的所有_sit()函数),以及一个exit()函数(以类似方式调用所有的_std()函数)
局部静态对象
constructor必须只能施行一次,虽然所在函数可能会被调用多次,只在初次调用的时候初始化
destructor必须只能施行一次,虽然所在函数可能会被调用多次
局部静态变量与全局变量共享全局数据区,但局部静态变量只在定义它的函数中可见
对象数组
若数组元素既没有定义constructor也没有定义destructor则工作并不会比定义内置类型数组更多
若有constructor和destructor则依次施行在数组上
Default Constructor和数组
编译器产生了一个内部的stub constructor,没有参数。在其函数内调用由程序员提供的constructor,并将默认default参数值显式地指定过去
6.2new和delete运算符
new运算符的使用:
1.通过适当的new运算符函数实例,配置所需的内存
2.将配置得来的对象设立初值
delete运算符的使用:
判断地址是否为0再进行操作
指针和该指针所指对象其差别在于哪一个的生命已经结束了
针对数组的new语意
对于Plain OI' Data只需要单纯地获得内存和释放内存即可
如果class定义了一个default constructor,就会调用对应函数来配置和构造class object所组成的数组,只有已经构造妥当的元素才需要destructor的施行。
寻找数组维度对于delete运算符的效率带来极大的冲击,所以只有在中括号出现时编译器才寻找数组的维度
施行于数组上的destructor是根据传入的“被删除之指针类型的destructor”,所以最好避免以一个base class指针指向一个derived class object所组成的数组
Placement Operator new的语意
placement operator new的实现方法:
1.将“获得的指针”所指的地址传回
2.将class constructor自动实施于所指地址
如果placement operator在原已存在的一个object上构造新的object,则应该显式地调用destructor而不是直接delete掉,因为这会释放指针所指内存
6.3临时性对象
在某些情况下,由processor产生临时性对象是有必要的,或是比较方便的。如此的临时性对象由编译器来定义
临时对象的被摧毁应该是对完整表达式求值过程中的最后一个步骤。该完整表达式造成临时对象的产生。(意即只有在完整表达式内任何一个子表达式产生的临时对象都必须在整个完整表达式被求值完成后才可以毁去)
凡持有表达式执行结果的临时性对象,应该存留到object的初始化操作完成为止
如果一个临时性对象被绑定到一个reference,对象将残留,直到被初始化之reference的生命结束,或直到临时对象的生命范畴(scope)结束——视哪一种情况先到达而定。
临时性对象的迷思
编译器能够消除内置类型的局部变量但对于class类型的局部变量就显得无能为力了
由上所述,通过适当努力,反聚合大有可为