勤能补拙,Expter

成都游戏Coder,记录游戏开发过程的笔记和心得!

一周总结,读书笔记

          这周主要是熟悉开发流程,阅读工程代码,熟悉方案逻辑,查看需求文档,然后就是看书学习,闲来无事可以听下歌,中午休息的时候去zoj做了几道题目。

         
        查看了接近一周的代码和书籍有了一下总结:
1.如果不需要一个类的对象不能被隐式的转换,可以在构造函数前增加关键字explicit  
   
 1template<class T>
 2class Array
 3{
 4public:
 5    explicit Array(int _size = 0);
 6    T & operator [](int index);
 7    
 8}
;
 9
10Array<int> a(10);
11Array<int> b(10);
12
13if (a == b[i])
14{
15    // 如果没有加explicit,可以编译通过,加了就不能通过
16}

17// 要转换可以使用
18if (a == static_cast<int> b[i])
19{
20    ..
21}

2.可以通过宏或者const常量,来优化,减少和优化常量,还可以利用宏来定义一些函数,或者字符串的处理。
   比如一个简单的字符串处理
  
1#define  STR(ST) #ST

3.容器的使用,注意各种函数的参数和返回值以及各种函数使用。
   比如:关联容器和标准容器在删除元素的时候会不同。
     例子:
 1对于ma等关联容器的元素删除
 2map<int,int> mp;
 3for (map<int,int>::iterator it = mp.begin(); it != mp.end();)
 4{
 5    if ()  //满足删除条件
 6    {
 7        mp.erase(it++);//删除当前节点,并返回下一个元素,自加
 8    }

 9    else
10    {
11        it++;
12    }

13}

14对于vector等标准容器的元素删除
15vector<int> ve;
16for (vector<int>::iterator it = ve.begin(); it != ve.end();)
17{
18    if ()  //满足删除条件
19    {
20        it = ve.erase(it);
21    }

22    else
23    {
24        it++;
25    }

26}

27
28关于2者区别主要是erase返回值问题,可以在网上查相关的说明,

4.关于内存池,基于动态分配的安全的线程池,可以利用2个参数,一个数据类型,一个锁类的参数模板。
   关于内存池可以阅读boost::pool 库相关文档,Boost pool 库引入了可用于实现快速内存分配的工具。正确的内存块对齐可以得到保证。

   根据 Boost 文档所述,当您分配和释放许多小型对象时,建议使用池。使用池的另一个不太明显的优点在于,作为程序员,您不必担心内存泄露:内存由 Boost 库在内部自动进行管理。要使用 pool 库,您不必在链接时提供特定的库——单凭头文件就足以完成链接了。 有多个接口对 pool 库可用:
   关于Boost pool可以阅读
  http://www.ibm.com/developerworks/cn/aix/library/au-util_boost_lib/


     另外实现一个锁类有很大的用处,比如
 1template<typename TyVal>
 2class Lock
 3{
 4public:
 5    explicit Lock()
 6    {}
 7    explicit Lock(TyVal val):_val(val)
 8    {
 9        //加锁
10    }

11    ~Lock(){//释放}
12private:
13    TyVal _val;
14}
;
15
16如果我们有一段代码需要加锁,则可以直接使用
17vector<int> Vint;
18Lock<vector<int> > lock(Vint);
19可以直到lock的声明周期结束,释放资源

5.关于重载操作符,本周看到同事们在讨论一个关于结构体的代码
  实例如下:
  
 1struct Test
 2{
 3    //
 4    
 5    Test & operator = (const Test &_t)
 6    {
 7        //关于此处是否需要增加一个 _t与*this的判断,
 8       memcpy(this,&t,sizeof(t));      
 9        return *this;
10    }

11    
12    //
13}
;
    因为效率和安全的问题,是否需要增加判断的代码,比如
     if(_t == *this)
     {
         return *this;
     }
   其实Effective C++的条款17: (在operator=中检查给自己赋值)的情况已经说了需要增加一个自检验证,我们姑且不考虑memcpy的数据重叠问题(new placement),增加一个明显有好处。

6. 必须有良好的OOA,OOD思想,这样能更快写出,高效的代码。
7. 算法重要,有良好的编程风格,在确保程序稳定的同时,增加效率。
 

个人总结不代表其他意见。。

posted on 2009-03-29 22:28 expter 阅读(2839) 评论(7)  编辑 收藏 引用 所属分类: 其他学习笔记工作笔记生活笔记

评论

# re: 一周总结,读书笔记 2009-03-29 22:55 bruce wuu

不错哦,你已经工作啦,主要具体做些什么工作呀?你的方向是什么呀?
我走游戏编程这条路 呵呵 现在还没什么工作经验呢  回复  更多评论   

# re: 一周总结,读书笔记[未登录] 2009-03-29 22:59 A

第一个的好拗口  回复  更多评论   

# re: 一周总结,读书笔记[未登录] 2009-03-30 00:08 jarod

如果我没记错的话,map.erase(it)后,it移动的结果是未定义的。有篇论文还专门讨论了这个问题。所以这个用法在不同的stl实现上会出现不同的结果,
最好不要这样用。但vector是可以的。  回复  更多评论   

# re: 一周总结,读书笔记 2009-03-30 08:48 路过的

>>>如果不需要一个类的对象不能被隐式的转换

似乎多了个不字吧


>>>memcpy(*this,_t,sizeof(_t));

能这么做吗  回复  更多评论   

# re: 一周总结,读书笔记 2009-03-30 09:11 expter

@路过的

写错了,
应该是 memcpy(this,&t,sizeof(t));
谢谢  回复  更多评论   

# re: 一周总结,读书笔记 2009-04-01 12:20 f

ding yi xia   回复  更多评论   

# re: 一周总结,读书笔记 2009-04-03 18:28 xx

要不让编译器提供=操作符 直接申明成private而且不去实现,这就行了

要删除容器内满足特定条件的元素 algorithm中的remove_if就行了 简单明了,还得注意如果容器里是指针删除时的情况。

5.关于重载操作符,本周看到同事们在讨论一个关于结构体的代码
实例如下:
1struct Test
2{
3 //
4
5 Test & operator = (const Test &_t)
6 {
7 //关于此处是否需要增加一个 _t与*this的判断,
8 memcpy(this,&t,sizeof(t));
9 return *this;
10 }
11
12 //
13}; 因为效率和安全的问题,是否需要增加判断的代码,比如
if(_t == *this)
{
return *this;
}

不管你是不是对this判断,这样做都是很危险的,如果结构体中有一个类,类中有虚函数,不能保证sizeof(t)就是你预想的结果  回复  更多评论   


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