迈克老狼

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/HermanOpenGL/archive/2009/01/21/3849193.aspx

 

都说看别人写的代码是一件很痛苦的事情,最近为了自残竟一股劲的死磕Ogre的代码,当然是牺牲了千千万万的脑细胞而进展却异常的缓慢。两个星期过去了,竟没有放弃的念头,看来人是会有进步的。

    毕竟还是菜鸟,而面对C++的博大精深,难免很多不懂的地方。其中就包括placement new。先看看Ogre其中的一段代码:

#define OGRE_NEW_T(T, category) new (::Ogre::CategorisedAllocPolicy<category>::allocateBytes(sizeof(T), __FILE__, __LINE__, __FUNCTION__)) T

    简单来说,这是一个宏。难点从new开始,我们先了解一下new后面括号里的函数的作用,这是一个分配函数,主要的功能是分配T类型的大小空间并返回指向这个空间的指针。那么在new和T之间加上这个函数有什么用呢?

    为了这个问题,确实花费了我很少时间,终于黄天不负有心人,在仅有的网页中找到了这个概念——placement new,中文不知道怎样翻译,姑且称它为“定位new”。通常,new负责在对内存里找到一块能够满足要求的内存块。而placement new可以说是它的一种变体,它能指定要使用的内存位置。语法大致如下:

new (T* buffer) T

    buffer就是你要放置T的内存指针,然后new出来的对象T就会放在buffer所指向的指针。so easy!

     回到上面的宏,大概的工作过程就是先调用allocateBytes(sizeof(T), __FILE__, __LINE__, __FUNCTION__)分配空间,这个函数返回的指针就相当于上面buffer,然后new T就会从这个指针开始分配空间。

     暂时了解的一个区别是,placement new使用的是静态内存,因此不能用delete来释放内存。至于更多的区别,有待更加深入的了解。

     Ogre究竟为何要这样做?阿弥陀佛,参透中!!!!


 

posted on 2009-11-03 14:08  迈克老狼  阅读(183)  评论(0编辑  收藏  举报