读书人

这个效能有没有更好的实现方式

发布时间: 2013-07-04 11:45:32 作者: rapoo

这个功能有没有更好的实现方式?

我有一组类,名字分别是,分别对应协议的各种请求,其中有一种请求是不需要解消息体的,直接将消息体转发就可以了。这种请求有七八个之多。
Common, ProtoReqA, ProtoReqB, ProtoReqC, ProtoSaveBody....
其中有

typedef ProtoSaveBody ProtoReqX;
typedef ProtoSaveBody ProtoReqY;
typedef ProtoSaveBody ProtoReqZ;


因为我在内存管理中使用了placement new,写了两个宏,一个用来NEW,一个用来DEL。

其中在对ProtoSaveBody这种类型的ProtoReqX调析构的时候,出现了一个不太好解决的问题。代码流程如下:
t = new(malloc(FIX_SIZE(namespaceA::ProtoReqX))) namespaceA::ProtoReqX(param1, param2);
.......
namespaceA::ProtoReqX* t = (namespaceA::ProtoReqX*) (decoder);
PL_DEL(ProtoReqX, t);
free(t);

因为ProtoReqX的析构函数本质上是~ProtoSaveBody,所以这里编译通不过。现在我只好写成
PL_DEL(ProtoSaveBody, t);

在gcc下,可以用typeof来搞定,在vc下怎么整?

另外,有没有人将boost::smart_ptr与boost::pool配套使用的?还是说内存池与smart_ptr都自己写了。

[解决办法]
用模板撒:

template <typename T>
void PL_DEL(T* x)
{
x->~T();
}



模板参数会推导, 不用给出, 只需要 PL_DEL(t) 就行了.

读书人网 >C++

热点推荐