c++模板偏特化的应用

动机

考虑这样一个需求, 在某项目中需要对动态内存进行限制以避免产生内存碎片这样的问题,需要实现一个内存池。让项目中的一些对象在内存池中拿取数据而不是直接用new在堆中取数据。那么对于一个对象的生成我们需要把内存分配和构造分开,同样的析构和内存收回也需要分开。对于前者,我们可以使用placement new来完成。后者则显式的调用析构函数。

讲到这里就有一个问题,自定义的结构体和类是有析构函数的,但是原始类型(int,double)是没有析构函数的,怎么办呢。

实现

先不考虑过多,把基本的写出来

//构造对象
template<class T1>
inline void construct(T1 *p){
    new (p)T1();//placement new
}

//清除对象
template<classs T>
void destory(T &e){
    e.~T();
}

为了区分T是否有构造函数,用两个标志类型进行区分

//清除类型
struct _false_type{
};
struct _true_type{
};

//有析构函数则继承这个结构体
struct destoryType{
    typedef _true_type has_destory;
};

//清除类型萃取器
template<class T>
struct _type_traits{
    typedef typename T::has_destory has_destory;
};

//利用特化版本,针对基本类型定义has_destory为_false_type
template<class T>
struct _type_traits<T*>{
    typedef  _false_type has_destory;
};


//新版本 destory 
template<class T>
void destory(T &ele){
     _destory(ele, _type_traits<T>::has_destory());
}

template<class T>
void _destory(T &ele, _true_type){
    ele.~T();
}
template<class T>
void _destory(T &ele, _false_type){}

测试代码

在栈上上面取内存,在获取的内存上构造对象并销毁。不释放内存

int main(){
    char buff1[8];
    char buff2[8];
    int * p1 = reinterpret_cast<int*>(buff1);
    Img * p2 = reinterpret_cast<Img*>(buff2);
    construct<int>(p1);
    construct<Img>(p2);
    destory<int*>(p1);//普通类型
    destory<Img>(*p2);//自定义类型
    getchar();
    return 0;
}
//output:
//construct Img
//destory Img

参考:

《STL源码剖析》中空间配置器的部分实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值