[读书笔记]深度探索C++模型_第六章_执行期语意学

6.1 对象的构造和析构

全局对象

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

C++程序中所有的 global objects 都被放置程序的 data segment 中。也就是静态变量区。
这里写图片描述

局部静态对象

const Matrix& identity() 
{
    static Matrix mat_identity;
    //...
    return mat_identity;
}
  • mat_identity 的 constructor 只能执行一次。
  • mat_identity 的 destructor 只能执行一次。

只在 identity() 被调用时才把 mat_identity 构造起来。(导入一个临时性对象以保护 mat_identity 的初始化操作,其实就是一个 flag)

6.2 new 和 delete 运算符

library 对于 new 运算符的实现操作都很直截了当,(以下并未考虑 exception handling)

extern void* operator new( size_t size)
{
    if( size == 0)
        size = 1;

    void* last_alloc;
    while(!(last_alloc = malloc(size)))
    {
        if( _new_handler)
            (*_new_handler)();
        else
            return 0;
    }
    return last_alloc;
}
extern void operator delete( void* ptr)
{
    if(ptr)
        free((char*)ptr);
}

最后就是避免以一个 base class 指针指向一个 derived class objects 所组成的数组。否则destructor很麻烦,下面是个解决之道。

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

临时性对象

  • 临时性对象的被摧毁,应该是对完整表达式求值过程中的最后一个步骤。该完整表达式造成临时对象的产生。
  • 凡持有表达式执行结构的临时性对象,应该存留到 object 的初始化操作完成为止。
  • 如果一个临时性对象被绑定于一个 reference,对象将残留,直到被初始化之 reference 的生命结束,或直到临时对象的生命范畴结束。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值