【导读】:本文主要介绍如何让new操作符不分配内存,只构造。
问题
c++中的new操作符 通常完成两个工作 分配内存及调用相应的构造函数。
请问:
如何让new操作符不分配内存,只调用构造函数?
这样的用法有什么用?
placement new的含义
placement new可以实现不分配内存,只调用构造函数。
void *operator new( size_t, void *p ) throw() { return p; }
placement new的执行忽略了size_t参数,只返还第二个参数。
其结果是允许用户把一个对象放到一个特定的地方,达到调用构造函数的效果。
用法如下:
#include #include class test { public: test() { std::cout << constructor << std::endl; }; ~test() { std::cout << destructor memberfunction(); ptask-> member; //...
第四步:对象的析构
一旦你使用完这个对象,你必须调用它的析构函数来毁灭它。按照下面的方式调用析构函数:
ptask->~task(); //调用外在的析构函数
第五步:释放
你可以反复利用缓存并给它分配一个新的对象(重复步骤2,3,4)如果你不打算再次使用这个缓存,你可以象这样释放它:
delete [] buf;
跳过任何步骤就可能导致运行时间的崩溃,内存泄露,以及其它的意想不到的情况。如果你确实需要使用placement new,请认真遵循以上的步骤。
性能对比
采用placement new和new的方式创建和删除对象一万次,统计时间,单位是us。
int main() { { uint64_t start = getcurrenttimeinmicroseconds(); for (uint32_t i = 0; i ~test(); } std::cout << getcurrenttimeinmicroseconds() - start << std::endl; } { uint64_t start = getcurrenttimeinmicroseconds(); for (uint32_t i = 0; i < 10000; ++i) { test* test = new test(); delete test; } std::cout << getcurrenttimeinmicroseconds() - start << std::endl; } }
结果:
placement new: 186 new : 1448
结论:在频繁构造和析构对象的场景中,placement new对性能有7倍的提升。
锤子新机最新消息汇总:锤子T3和锤子坚果Pro即将来临,颜值有点令人眩晕!配置呢?
京东方斥资1395亿元建三条第6代AMOLED生产线
高精度电流传感器微电流检测突破进展
杜邦全新Crastin PBT解决方案,提升激光焊接效果
使用Verdi的小技巧
如何让new操作符不分配内存,只构造
SQL优化技巧分享
新iPad Pro从Lightning接口改为USB-C接口
晶振在通信设备模块中的作用
单螺杆空压机排气温度高的原因及解决措施
采用TB62734FMG的白光LED驱动器项目
I²C总线与SMBus的比较指南
0-100km/h仅需5秒,深度解析保时捷卡宴E-Hybrid技术
从Tesla与BMW看无人工厂 连Musk都坦承的错误
涨价潮的背后,剖析硅片市场的供需结构
中国大陆手机品牌降价促销 被动元件厂有望迎急单
您的无线选择:Wi-Fi、蓝牙,还是两者兼而有之?
石墨烯增强——未来的材料
各国人工智能战略谁更加强
初级PC-HiFi也可以是一个满意的作品