placement new的作用

本文介绍了 Placement New 的作用及使用方法,Placement New 可以在已分配的内存块上创建对象,适用于频繁创建和销毁对象的场景,以减少内存分配与释放带来的性能损耗。

原文地址:http://hi.baidu.com/aoran51423/blog/item/cc3ed426a6b4a21d8a82a18f.html

 

 

placement new的作用就是:创建对象但是不分配内存,而是在已有的内存块上面创建对象。

用于需要反复创建并删除的对象上,可以降低分配释放内存的性能消耗。

 

 

 

### `operator new` 与 `placement new` 的区别及使用场景 在 C++ 中,`operator new` 和 `placement new` 是两个不同的概念,尽管它们都与内存分配和对象构造相关。理解它们的区别有助于更高效地管理内存和控制对象生命周期。 #### `operator new` `operator new` 是一个标准库函数,其主要职责是分配原始内存空间。它不涉及对象的构造过程。基本形式如下: ```cpp void* operator new(std::size_t size) throw(std::bad_alloc); ``` 当调用 `new` 表达式时,例如: ```cpp MyClass* obj = new MyClass(); ``` 编译器会隐式调用 `operator new(sizeof(MyClass))` 来分配内存,然后在该内存上调用构造函数来初始化对象[^4]。如果内存分配失败,`operator new` 会抛出 `std::bad_alloc` 异常,除非使用了 `nothrow` 版本。 用户可以重载 `operator new` 以实现自定义的内存分配策略。例如,在实现自定义内存池或容器类时,这种机制非常有用。通过重载,开发者可以控制内存分配行为,而不影响 `new` 表达式的语义。 #### `placement new` `placement new` 是 `operator new` 的一种特殊形式,用于在已分配的内存中构造对象。它的典型形式如下: ```cpp void* operator new(std::size_t, void* location); ``` 这个版本的 `operator new` 不会分配新的内存,而是返回传入的指针 `location`,即直接在指定的内存地址上构造对象[^1]。因此,它通常与手动内存管理结合使用,比如在预分配的缓冲区中构造对象。 使用 `placement new` 的典型方式如下: ```cpp char buffer[sizeof(MyClass)]; // 预分配内存 MyClass* obj = new(buffer) MyClass(); // 在 buffer 上构造对象 ``` 这种方式允许开发者精确控制对象的内存位置,适用于嵌入式系统、性能敏感的库(如 STL 容器)或需要严格内存对齐的场景。 需要注意的是,`placement new` 不可重载,因为它只是简单地返回传入的指针,不涉及内存分配逻辑。 #### 总结对比 | 特性 | `operator new` | `placement new` | |-----------------------|------------------------------------------|------------------------------------------| | 是否分配新内存 | 是 | 否(使用已有内存) | | 是否调用构造函数 | 否(仅分配内存) | 是(在已有内存上构造对象) | | 可否被重载 | 是 | 否 | | 典型用途 | 自定义内存分配策略、容器内部实现 | 在特定内存位置构造对象 | #### 示例代码 ```cpp #include <iostream> #include <new> // for placement new struct MyClass { int value; MyClass() : value(42) {} }; int main() { // 使用 operator new 分配内存 void* rawMemory = ::operator new(sizeof(MyClass)); // 使用 placement new 构造对象 MyClass* obj = new(rawMemory) MyClass(); std::cout << "Value: " << obj->value << std::endl; // 显式调用析构函数 obj->~MyClass(); // 释放原始内存 ::operator delete(rawMemory); } ``` 此示例展示了如何结合 `operator new` 和 `placement new` 来手动管理内存生命周期,这在高性能库开发中是常见做法。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值