关于placement new

    都说看别人写的代码是一件很痛苦的事情,最近为了自残竟一股劲的死磕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究竟为何要这样做?阿弥陀佛,参透中!!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值