找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 5380|回复: 4

如何使用标准库存储自定义类,存储自定义类指针

[复制链接]
发表于 2008-9-20 15:42:29 | 显示全部楼层 |阅读模式
我们想使用标准库来对自己定义的类来操作,比如list,map ,vector,我定义了新的类
myclass,我想用
typedef std::list<myclass> ;
typedef std::vector<myclass> ;
typedef std::map <char*,myclass> T_applCfg_Map;
这样使用好?还是用类指针存储好?
typedef std::list<myclass*> ;
typedef std::vector<myclass*> ;
typedef std::map <char*,myclass*> T_applCfg_Map;
请高手提供实际经验中的使用。谢谢。
 楼主| 发表于 2008-9-20 15:42:36 | 显示全部楼层
我的经验:
其实没有固定的模式,有的时候,用对象合适,有的时候,用对象的指针合适。
在你存储的信息内容,不需要怎么更改的时候,用对象舒服,因为生存期由STL控制了。如果需要频繁更改容器中的数据,用指针更好,避免对象复制的消耗,性能更优秀。
但各中细节,请自己写程序慢慢体会吧。
 楼主| 发表于 2008-9-20 15:42:46 | 显示全部楼层
如果不存在成本非常高的constructor & destructor的话,尽量用对象的方式.

否则参考使用smart_ptr作为wrapper放入container中.
 楼主| 发表于 2008-9-20 15:42:54 | 显示全部楼层
否则参考使用smart_ptr作为wrapper放入container中.
I can smell core dump here. It's more complex than you thought to
put a smart pointer into a container. I never put std::auto_ptr into
stl::container, jus my .02.
发表于 2010-2-9 23:14:17 | 显示全部楼层
感觉因为constructor & destructor 的原因而从而选择实体或指针的原因感觉不多, 因为今天代入没有构造代价的struct 作为容器typename, 明天说不定也要为该struct 增加constructor.

使用实体的话, 我觉得有一个好处就是在多线程中可以使用粒度更加小的锁, 因为你只需要对取值函数内部上锁就够了,指针的话你起码要把指针的逻辑跑完才能解锁.
虽然使用实体增加了对 construct 和 destructor的成本, 但锁的范围变小了,性能也随着提高了. 毕竟现在的CPU核心越来越多了, 别让它们闲着性能才能上去.

如果业务处理是单线的话, 其实还是建议使用原始指针, 毕竟不需考虑锁的问题.

智能指针使用得当的话, 在多线程下, 可以实现和实体一样的锁操作粒度, 近乎原始指针的效率, 而且还不需要进行二元操作.
但只是对习惯用继承, 派生, 子类与父类之间强制转换来说, 又要从智能指针中取出原始指针作转换, 如果转换后要外送到下层逻辑进行处理又要对原始指针进行上锁, 和使用原始指针的初衷相背, 一点也不kiss, 一点也不爽. 智能指针的使用还是见仁见智吧.

不过智能指针还有一个不得不提的好处( 至少我认为是= = ), 在大量使用智能智针时, 会显现一些原始智针不会显现的问题, 通常是架构分层不清晰导致, 可以借此修正一下架构分层.

[ 本帖最后由 木头人 于 2010-2-9 23:47 编辑 ]
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-12-22 16:54 , Processed in 0.027486 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表