乐于分享
好东西不私藏

C++ STL源码:std::vector::push_back 实现分析,内存不足时如何扩容?

C++ STL源码:std::vector::push_back 实现分析,内存不足时如何扩容?

我是一名软件工程师,自2006年开始学习《计算机科学与技术》专业课程,于2010年完成大学本科阶段的专业课学习并于同年参加工作。2010年至今一直在一线从事软件研发相关的工作,有着丰富的编程与踩坑经验,希望我的文章能给你带来些许帮助!

源码版本:gcc-15.1.0

C++11 以上版本实现本质是 emplace_back()。

容量不足时的代码执行过程

补充说明

uninitialized_move_if_noexcept 把旧内存中的元素移动(或拷贝,如果移动可能抛出异常)到新内存,保证了异常安全。之后会通过 _Guard_elt 等 RAII 机制自动销毁旧内存中的元素并释放旧内存。

代码里的 _Guard 相关结构是用来保证异常安全:如果在构造新元素或移动旧元素的过程中抛出异常,它会自动清理已经分配的资源,避免内存泄漏。
_S_relocate是 C++20 引入的优化,在支持的情况下会用更高效的内存重定位来代替元素的移动,你的标注里也提到了这一点,非常准确。

扩容算法(计算需要扩充的容量大小)

扩容策略:新容量 = 当前已用容量 + max (当前已用容量,新增需要的容量):


合作交流请扫码,喜欢,就 “关注+点赞+推荐+转发” 吧!
作者寄语
首先感谢所有能够认真读完我的文章的道友。在每篇文章发布前我都会做认真校对,但受限于作者知识的局限性,文章中也难免会出现一些瑕疵与错误的地方,如您阅读时发现错误,欢迎您留言或私信告诉我,我会做勘误处理。
关于写作的目的:此公众号的所有文章都是我在业余时间对自己知识体系梳理后的成果展现,之所以选择在公众号做输出,一是想给自己的知识找个家,方便自己翻阅;二是希望能够让我的文章能够帮助一些在编程领域还没入门的朋友;最后也是希望能有机会给自己加个鸡腿
关于更新频率因为我是利用业余时间写的文章,要保障文章的内容有价值且正确,所以我不能保证每天更新,但是尽量每周至少更新一篇。
如果我的文章对您有些许的帮助,您可以留言告诉我;如果您希望对某些知识点做更深入的了解与学习,也可以留言告诉我;最后感谢您对我的认可!
本站文章均为手工撰写未经允许谢绝转载:夜雨聆风 » C++ STL源码:std::vector::push_back 实现分析,内存不足时如何扩容?

评论 抢沙发

8 + 7 =
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
×
订阅图标按钮