当前位置: 首页 > news >正文

C++的定位放置new(Placement new)

C++的定位放置new(Placement new)

c++ primer第18章 特殊工具与技术 优化内存分配 

char buffer[sizeof(MyClass)];
MyClass* obj = new (buffer) MyClass(); // 在buffer上构造对象

内存池(Memory Pool)通过预分配大块内存并使用定位new在其中构造对象,可显著减少内存碎片和分配延迟。

class MemoryPool {
public:void* allocate() { /* 返回预分配内存块 */ }void deallocate(void* p) { /* 回收内存块 */ }
};MemoryPool pool;
MyClass* obj = new (pool.allocate()) MyClass(); // 使用内存池分配

 

对象池实现(使用 malloc + placement new)

template<typename T>
class ObjectPool {std::vector<T*> available_;std::vector<void*> memory_blocks_;  // 预分配的内存块public:// 预分配 N 个对象的空间void Init(size_t count) {void* block = malloc(sizeof(T) * count);  // 一次性分配大块内存
        memory_blocks_.push_back(block);for (size_t i = 0; i < count; ++i) {available_.push_back(reinterpret_cast<T*>(static_cast<char*>(block) + i * sizeof(T)));}}T* Acquire() {if (available_.empty()) return nullptr;T* obj = available_.back();available_.pop_back();new (obj) T();  // placement new:在已分配内存上构造return obj;}void Release(T* obj) {obj->~T();      // 显式析构available_.push_back(obj);  // 回收到池中,内存不释放
    }~ObjectPool() {for (auto block : memory_blocks_) free(block);}
};

参考:https://blog.csdn.net/FeiPeng_/article/details/108281837