直接 new/delete 的问题:
// 假如 vector 内部用 new[]/delete[] 管理内存
// 那么每次 push_back 导致扩容时:
// ① new[] 分配新内存 + 默认构造 N 个元素(浪费!其实我只想申请内存,不构造)
// ② 拷贝/移动旧元素
// ③ delete[] 旧内存 + 析构所有元素(又浪费!其实我只想释放内存,不析构)
分配器把"分配内存"和"构造对象"分开了:
// vector 底层实际做的
Alloc alloc;
T* p = alloc.allocate(10); // 只分配 10 个 T 大小的空间,不构造
// 这 10 个位置是原始内存,里面可能放着旧数据
alloc.construct(p + 3, args); // 在第 4 个位置构造一个新对象(placement new)
// 现在 p+3 才真正有了一个 T 对象
alloc.destroy(p + 3); // 手动调用析构
alloc.deallocate(p, 10); // 只释放内存,不析构
分离的意义:
reserve:只 allocate,不 construct——所以 reserve 快。pop_back:只 destroy,不 deallocate——所以 pop_back 快。- 自定义分配器只需重写 allocate/deallocate,construct/destroy 有默认行为。