STL空间配置器
想象你要建一个小区(容器,比如vector)
空间配置器就是你的「建材物流总管」,负责两件大事:
1️⃣ 买地皮和回收地皮(内存分配/释放)
2️⃣ 盖房子和拆房子(对象构造/析构)
1. 买地皮 vs 盖房子
-
普通开发商(new运算符):买地皮后马上盖满房子(
new=malloc()+ 构造函数) -
精明开发商(allocator):先买大片空地,需要时再慢慢盖房
// 普通做法:每次买一块地立刻盖一间房
Person* p = new Person();
// 精明做法:
allocator<Person> alloc;
Person* land = alloc.allocate(5); // 先买5块空地
alloc.construct(land, "张三"); // 在第一块地盖房
2. 拆房子 vs 还地皮
-
普通做法:拆房时直接连地皮一起卖掉(
delete= 析构函数 +free()) -
精明做法:先拆房保留地皮,等攒够多地皮再统一归还
// 普通做法:拆一间房就卖一块地
delete p;
// 精明做法:
alloc.destroy(land); // 只拆房子
alloc.deallocate(land,5); // 攒够5块空地一次性归还
为什么需要空间配置器?
️ 省时省力:一次性申请大片内存,避免频繁找系统要内存
灵活调度:像搭积木一样重复利用内存空间
内存池黑科技:高级allocator会预存内存块,速度比直接malloc快得多
日常使用场景
当你写vector<int> vec;时:
vec.push_back(10)背后是allocator在:
1️⃣ 检查是否有空房(剩余容量)
2️⃣ 没空房就买更大的地皮(扩容)
3️⃣ 把旧房子复制到新地皮
4️⃣ 拆掉旧房子,归还旧地皮
重点总结
-
内存分配 ≠ 对象创建(先有地才能盖房)
-
对象销毁 ≠ 内存释放(拆了房还能再盖新的)
-
STL容器悄悄用这个机制实现高效内存管理
下次看到vector扩容时,就能想象到allocator在幕后忙着搬砖盖房啦!一般我们不用自己写allocator,但了解原理能更好理解STL的性能秘密~

浙公网安备 33010602011771号