读了libstdc++ std::allocator源码,发现它在GCC 5之后被彻底重写了——C++内存分配的3层架构
打开GCC 12的libstdc++源码,翻到bits/allocator.h,找到std::allocator<T>的allocate()成员函数——你猜里面有多少行实现代码?不是SGI STL时代那个维护着16个free-list、管理着一整套内存池的复杂二级配置器,不是侯捷《STL源码剖析》里用了整整一章才讲完的__default_alloc_template,而是一行:return static_cast<_Tp*>(::operator new(__n * sizeof(_Tp)));——就这一行,没有内存池,没有free-list,没有128字节的阈值判断,什么都没有,直接调用全局的::operator new然后把指针强转成目标类型返回。如果你读过侯捷的书(几乎所有认真学过STL的C++程序员都读过),你大概率会在这一刻产生一个强烈的认知错位:那个曾经如此精巧复杂的SGI STL空间配置器,那个用union obj同时充当数据和链表指针的天才设计,那个从内存池里一次切出20个节点的高效分配策略——它们全部消失了,被替换成了一个看起来简单到不值一提的::operator new封装。
这不是一个小变化。这是C++标准库在内存分配策略上的一次根本性的架构重构——从"标准库自己管内存"变成"标准库信任操作系统来管内存"。而要理解这次重构为什么发生、为什么是正确的、以及它对你写C++代码意味着什么,你需要看清楚C++内存分配的三层架构:最上面一层是std::allocator和allocator_trait
