读了libstdc++ std::allocator源码,发现它在GCC 5之后被彻底重写了——C++内存分配的3层架构
打开GCC 12的libstdc++源码,翻到bits/allocator.h,找到std::allocatorT的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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2586862.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!