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

本文探讨了小对象分配策略,通过自定义new/delete操作符实现内存高效管理。利用Singleton模式确保SmallObjAllocator全局唯一,便于资源统一调配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值