C/C++问题求助
这两天遇到一个面试题:
面试官:vector扩容为什么不知道在后面?比如可以先判断后面的内存空间够不够,够的话直接在后面扩容,不够的话再重新申请空间并复制数据。
我:后面的空间可能已经被占用,如果判断则需要额外的数据结构去维护,这并不一定会提高效率。
面试官:可以从内存池的角度考虑考虑
我:(思考一会儿,然后瞎猜...)直接在后面可能会产生较大的内部碎片?
面试官:好,下一个问题......
所以各位佬,为什么vector不直接先判断后面的空间???
面试官:vector扩容为什么不知道在后面?比如可以先判断后面的内存空间够不够,够的话直接在后面扩容,不够的话再重新申请空间并复制数据。
我:后面的空间可能已经被占用,如果判断则需要额外的数据结构去维护,这并不一定会提高效率。
面试官:可以从内存池的角度考虑考虑
我:(思考一会儿,然后瞎猜...)直接在后面可能会产生较大的内部碎片?
面试官:好,下一个问题......
所以各位佬,为什么vector不直接先判断后面的空间???
全部评论
佬,可以看看这个问题:https://www.zhihu.com/question/384869006
应该是动态内存分配的部分吧,应用vector申请的空间在freelist中挂在相应的位置了,如果向后扩容,freelist挂的内存首地址的空间被使用了,其他stl申请空间,可能会覆盖扩容的位置数据,所以直接扩容,取对应freelist上挂的空间吧。我猜的哈,不一定对
C++ 标准库容器的动态内存分配是交予分配器(Allocator)类处理的。故而分配器提供什么接口,标准库容器的内存操作才能用什么。从 C++98 至今标准库的分配器要求都缺少原位扩张/收缩的接口,所以 vector/basic_string 也用不了。实际上有 N3495 、P0401 、 P0894 等零星提案建议增加分配器的接口,以支持这些功能,但是这些提案都没有通过。

这个我的专栏有收藏在c/c++模块
m
m
m
m
相关推荐
点赞 评论 收藏
分享
2025-11-13 14:37
门头沟学院 Java 程序员牛肉:是的,我觉得你最先需要的是多接触计算机圈子。我感觉你这个写的太幼稚了,根本没换位思考面试官。
你对实习的描述还是我写了前后端,我写了Restful接口,我用了EChatrs。你这让面试官怎么问你?问你什么是前后端?问你什么是Restful?讲真的兄弟,你这个简历在面试官眼里就是啥也不懂的好学生。所以一定要尽快加入一个圈子跟大家多聊聊,看看正儿八经的简历是怎么写的。
可以看一下我首页的简历怎么写那篇文章来学一下,你这里面的坑点我那篇文章里面都有讲过。
点赞 评论 收藏
分享
查看8道真题和解析