focus on linux, c/c++, lua

对象池中的对象有容器成员变量,会如何?欢迎讨论

在我的代码中,一直用对象池管理部分对象的分配。我是对哪些对象才使用对象池呢?我只有一个原则就是:
当某种对象会被频繁的new和delete的时候,我会对这个对象使用对象池。

前两天,我在我的代码中发现了有这样一个类:

class CPlayer : public IPlayer
{
public:
    CPlayer();    
    
virtual ~CPlayer();
    
virtual void Release();
    
virtual IServerSession* GetLoginSvr();
    
virtual GAMESVRVEC& GetGameSvrVec();
    
virtual INTVEC& GetFriendVec();
    
virtual INTVEC& GetBeFriendVec();
    
virtual st_info* GetUserInfo();
    
virtual IContainer* GetBag();
    
virtual IContainer* GetStorage();
    
virtual IContainer* GetHotKey();
    
virtual void SetBag(IContainer* pContainer);
    
virtual void SetStorage(IContainer* pContainer);
    
virtual void SetHotKey(IContainer* pHotKey);
    
void SetLoginSvr(CUserSession* pSession);    
    
void SetRelationSet(char cSet);
    
void SetUserInfo(const st_userinfo& stInfo);
private:
    CUserSession
* m_pLoginSvr;
    GAMESVRVEC m_vecGameSvr;
    INTVEC m_vecFriend;
    INTVEC m_vecBeFriend;    
    
char m_cRelationSet;
    st_info m_stUserInfo;
    IContainer
* m_pBag;
    IContainer
* m_pStorage;
    IContainer
* m_pHotKey;
}
;

由于这个玩家类,在玩家上下线的时候要频繁的分配和释放,于是我就创建了一个这个玩家的对象池。但是我发现这个类中含有大量的容器和指针,我顿时觉得这个对象池除了能省去频繁的new和delete好处之外,对内存管理几乎没有。因为容器或是指针还要去管理自己的内存,在网上有个同学和说,当结构中有容器成员变量时是不能用对象池的,因为对象池要求大小尺寸固定,但容器的尺寸不固定。我觉得他这种说法是不正确的,其实sizeof(容器)也是一个固定的值,只是容器另外还要管理自己的空间而已。那么遇到这种情况,这种对象池是否有必要,如果不用,我一样还要去new和delete。有的同学说,你这种设计就是错误的,应该把容器和其他的定长变量分开管理,只对定长变量做对象池管理,可是在代码的设计中,仅仅是为了这个池,把代码拆的凌乱不堪,我还不如不用。同学们,告诉我的你想法是什么?谢谢

再更新一次,还有很多大牛的声音没有听到!

posted on 2010-05-20 14:21 zuhd 阅读(1502) 评论(3)  编辑 收藏 引用 所属分类: c/c++

评论

# re: 对象池中的对象有容器成员变量,会如何?欢迎讨论 2010-05-20 14:55 zuhd

@空明流转
哪句话?这么激动?  回复  更多评论   

# re: 对象池中的对象有容器成员变量,会如何?欢迎讨论 2010-05-20 15:29 Kevin Lynx

我觉得完全可以忽略子对象(成员变量对象)的细节,也就是说假设这里的内存池只管理player,那么你就没必要去理会这些容器底层的细节。因为这会成为一个递归的情况。
如果仅仅是为了缓存player本身,最好还是在将player放回池中的时候,来次reset吧。不然下一次再取出来的时候,会得到一个并非处于initial状态的对象,这会增加逻辑的负担。  回复  更多评论   

# re: 对象池中的对象有容器成员变量,会如何?欢迎讨论 2010-05-20 16:02 zuhd

@Kevin Lynx
池中的对象都类似与有一个Release的函数,去做释放具体对象中的资源,比如,对象中的IContainer*。其他的变量的初始化,也可以不在这里做,毕竟从池中取出来的时候,还要初始化一遍的!
  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理