Ineffective C++(1):STL容器不仅仅可以保存指针

前言

       在公司这两年没少带新人,有刚毕业的,也有工作了两三年的。除了要把公司项目的一些知识告诉他们,通常了需要review一下他们的代码。发现很多人在C++的基本概念上存在错误或者偏差,或者某种习惯用法有瑕疵。这些问题千奇百怪,往往令人哭笑不得。一直想把他们记录下来,于是有了此系列。此系列标题取为Ineffective C++绝对没有想与大师比肩的意思,纯粹是为了搞笑。:)


STL容器不仅仅可以保存指针

        我就不明白为什么如此之多的人使用 list 或者 vector 时只用它保存对象的指针。如果对象是一个复杂的 class ,它的拷贝构造和赋值操作比较昂贵,那当然是使用 list<MyClass*> 是很合理的。问题是一个简单的 struct ,类似:

struct tagItem
{

       int   nID;

       int  nNum;
};

他都要使用list<tagItem*>,最晕的是当需要一个列表保存一些物品ID时,我看到了下面的数据定义:
     list<DWORD*> m_itemIDList

每次需要添加一个时,就需要new一个DWORD,然后赋值,然后push_backlist中,在erase之后还要记得delete

 

产生这种用法(下面只谈类似list<tagItem*>这种)多数处于两种原因:

1.       STL不熟悉
list
是否帮你保存对象呢?如果你使用list<tagItem>,当你push_back的时候发生了什么呢?如果你还不是很确定答案的话,那你一定要把《C++标准程序库—自修教程与参考手册》好好的读一遍。

2.       过分担心性能
有的人告诉我,他认为tagItem的拷贝会影响效率。恩,考虑到了效率,算是一个进步,但是这笔账还是要算得更清楚一些。tagItem对象到底占多少字节?你的这个list是不是会经常更新?每帧更新几次,还是当某个事件产生时才操作一次?多数情况下,这点性能损失时不值得你手动管理一个tagItem对象的内存的。

 

总结一下,对于简单的数据类型,强烈推荐使用list<tagItem>这种写法,除非你仔细考虑了性能问题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值