std::allocator的工作机制与默认行为
C++标准库中std::allocator的职责是什么?它如何分配和释放内存?std::allocator的construct和destroy在C++17和C++20中有哪些变化?为什么容器需要分配器而不是直接使用new/delete?
回答
孤独的心
std::allocator职责:将内存分配/释放与对象构造/析构分离,提供两层抽象。
核心接口:
allocate(n):分配n个T类型的原始内存(不构造),返回T*。底层通常调用::operator newdeallocate(p, n):释放内存construct(p, args):(C++17前)在p处构造对象;C++17起弃用,推荐std::allocator_traits::construct或直接new(p) T(args)destroy(p):(C++17前)析构对象;C++17起弃用
C++17/20变化:construct/destroy被弃用,std::allocator_traits提供了默认实现(使用placement new和显式析构)。容器通过std::allocator_traits间接使用分配器,实现统一接口。
为什么不用new/delete:
- 解耦需求:vector预先分配内存但延迟构造(如reserve),new会立即构造
- 分配器可自定义:不同类型的内存策略(内存池、共享内存等)
- rebind机制:
allocator<T>::rebind<U>允许分配器分配另一种类型的内存 - 有状态分配器:支持带状态的分配器(如区域分配器)
默认std::allocator性能:通常封装::operator new/delete,无特殊优化(无内存池)。