小对象的分配技术(4/4)

4.SmallObject

小对象分配策略在SmallObjAllocator层已经柳暗花明,可以猜测SmallObject是个顶级包装,使得使用更方便,确实是这样的,“SmallObject的定义 非常简单,只不过情节有点复杂”。

class  SmallObject
{
public:
    
static    void*    operator new(std::size_t    size);
    
static    void    operator delete(void* p,std::size_t    size);
    
virtual    ~SmallObject(){}
}
;

需要注意的一点是delete的类级别重载:

class  Base
{
public:
    
static void    operator delete(void* p,std::size_t    size)
    
{
        cout
<<"you call my delete"<<endl;
        ::
operator delete(p);
    }

}
;

int  _tmain( int  argc, _TCHAR *  argv[])
{
    Base
*    haha    = new Base;
    delete    haha;
    
return 0;
}

如你所见,delete haha得时候,我们定义的delete得到了调用,也就是编译器提供给了我们额外的一个参数size,这也是Andrei要讨论编译期获取size的策略的原因,编译器给我们传了额外参数,我们有必要了解一下编译器开发者怎么做的。但注意,只是了解,我觉得在这里明白类operator delete以及定义类类虚析构函数的重要性就可以了。

对于整个程序里的SmallObject而言,我们只需要一个SmallObjAllocator,这就是Singleton模式了,可以抢先欣赏一下Loki得SingletonHolder:

typedef    SingletonHolder < SmallObjAllocator >     MyAlloc;
void *     SmallObject:: operator   new (std::size_t    size)
{
    
return    MyAlloc::Instance().Allocate(size);
}

void     SmallObject:: operator  delete( void *  p,std::size_t size)
{
    MyAlloc::Instance().Deallocate(p,size);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值