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); } };
浙公网安备 33010602011771号