對象池本質是管理指針容器,**容器選型決定性能上限**。實測:vector/queue 實現的對象池性能接近裸指針管理,list 明顯慢 3-5 倍。
template<typename Pool>
void benchmark(Pool& pool, int iterations) {
auto start = std::chrono::high_resolution_clock::now();
for (int i=0; i<iterations; ++i) {
auto* obj = pool.pop();
// 模擬使用
pool.push(obj);
}
auto end = std::chrono::high_resolution_clock::now();
std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(end-start).count() << "ms\n";
}
| 容器 | 數據結構 | push/pop 複雜度 | 緩存友好 | 實測相對耗時 |
|---|---|---|---|---|
std::vector (作棧用) | 動態陣列 | O(1) 攤還 | ⭐⭐⭐⭐⭐ | 1.0x (基準) |
std::queue (底層 deque) | 分段連續陣列 | O(1) | ⭐⭐⭐⭐ | 1.1x |
std::list | 雙向鏈表 | O(1) | ⭐ (節點分散) | 3.5x ~ 5x |
pool.reserve(max_size) 避免擴容拷貝pop() 返回對象指針,push() 回收,構造/析構只在池創建/銷毀時發生vector 做棧(LIFO)最快moodycamel::ConcurrentQueuestd::unique_ptr<T> 而非 T 本身template<typename T>
class ObjectPool {
std::vector<T*> _free;
public:
ObjectPool(size_t capacity) { _free.reserve(capacity); }
T* acquire() {
if (_free.empty()) return new T();
T* p = _free.back(); _free.pop_back(); return p;
}
void release(T* p) { _free.push_back(p); }
~ObjectPool() { for (auto p : _free) delete p; }
};