🍎06-C++面试之STL内存管理篇

[toc]

0 前述

针对于自己在秋招的面试中,对于CPP部分遇到的问题,其中大部分是以此为起点,你可以基于这些点,将自己对于CPP学习的知识点,串联起来。无论面试官,问这一类问题中的某个点,你都应该可以将这一个珠子串联到自己的知识链上来讲。这是一种拓展知识的能力。

在此专栏下面个人校招记录:回馈牛客,对CPP做一个小小的总结。

本部分关于CPPSTL的内存管理方式的点来展开即可,分别讨论普通的内存管理方式和STL的内存管理方式,以及STL内存管理方式本身的可改善的点。

  • 下面对应的是之前发布的个人校招其他公司面试总结,希望可以更好的帮到你

这里是`CPP一些面试问题整理

1 普通的内存管理方式

我们知道动态开辟内存是,要在堆上申请;

1)如果说需要的频繁的话,就需要一次次在堆上开辟和释放内存,并且会造成内存碎片化,浪费内存空间(在申请一整个大块内存空间的时候,都是不连续的小碎片);

2)且每次申请都要进行调用mallocfree操作,造成配置时的一些额外负担。

以此,以效率著称的STL库,提出两级空间配置器。1)当一次申请的内存够大,超过128bytes时,就移交给第一级配置器处理,就是直接newdelete出一块大内存;2)当一次申请的空间小于128bytes,就使用二级配置器以内存池的形式进行管理。内存池的一个显著优点就是尽量避免内存碎片,使得内存分配效率得到提升。

2 STL内存管理方式

  • 整体形式,维护16free-list,对应各大小的内存块,从0~15号,内存最小8bytes,以8bytes逐渐递增,最大128bytes。传入的参数会自动将内存需求量上调至8的倍数(比如客户端需要30bytes,这边就自动商调至32bytes),找到32bytes所对应的内存大小的链表;

  • 查看是否为空,不为空的话就直接从该链表中取出一个分配给该请求,再将对应链表的指针向后移动一位。

  • 若对应的链表为空的话,进一步,先看看内存池是不是空的,不空,就从内存池里面分配

    1)先检查内存池剩余空间,够不够20个(默认)这样的(32bytes大小)的空间,若足够就直接拿出,将一个分配出去,剩下的挂载对应的free-list下,等待下次分配。

    2)如果不够20个大小,看够不够1个,够1个就先直接分配出去。再更新free-list,将内存池剩余的空间分配尽可能多的节点挂在其他free-list上面。

    3)若果池子剩余的空间一个都满足不了的话,先将内存池中剩余的空间挂在相应小内存的free-list上,然后,找老大"系统"😎给内存池分配空间。

  • 内存池空的话

    1)给内存池申请内存,使用malloc()heap上申请内存(一次申请的内存大小为= 2*所需节点内存(8的倍数) * 20个 + 一段额外的空间),大约申请40块,一半拿来用,放在free-list上面;一般放在内存池中。

    ​ 😯一个奇怪的提问:为什么会是乘以2的操作,就和vector,在存放满的时候,进行扩充一样,为什么是2倍,不是1.5倍这样的扩充:(曾经有个面试官这样问过)

    答:目前看来大致是,2对于计算机来说比较好处理一些,二进制直接使用10即可表示出来。

    2)假若系统中没有malloc出来,说明heap(系统)上也没有内存了,那就从其他大的free-list上借一个节点使用。如果系统上也没有找到,那就只能调用一级配置器。

3 STL的一些缺点

  • 自由链表的管理问题,把所需要申请的内存自动调整到8的倍数。比如,你需要申请1个字节的话,也就给你8bytes,浪费,久而久之,也会造成内部碎片的问题。

  • 内存的使用过程中,所申请的内存会一块块挂在free-list上面,也不会还给操作系统,申请的内存只有在当前进程结束的时候,才会释放内存。

    1)开辟小内存开辟的太多,导致申请大内存的时候,就容易失败;

    2)申请的内存太多,不归还,别的进程想用但是没有,会引发问题。

#晒一晒我的offer##我发现了面试通关密码##找不到实习会影响秋招吗##面试#
个人校招记录【回馈牛客】 文章被收录于专栏

这是一个求职总结专栏,求职过程中,牛客里面各位同志,提供了很多面试的信息,对我个人有很大的帮助。这里简单将自己面试记录总结于此。 本人23届校招生,双非硕士,投递岗位嵌入式,控制算法,后台开发均有涉猎,优先级递减。简历累计投递数量:提前批(34)+正式批(128),累计Offer(5+)。

全部评论
感谢分享,收藏了,正好复盘😁
1 回复 分享
发布于 2023-09-17 22:23 安徽

相关推荐

11-26 22:34
已编辑
重庆邮电大学 Java
快手 客户端开发 (n+5)k*16 公积金12
牛客895077908号:佬 什么双非硕啊
点赞 评论 收藏
分享
头像
11-09 17:30
门头沟学院 Java
TYUT太摆金星:我也是,好几个华为的社招找我了
点赞 评论 收藏
分享
找不到工作死了算了:没事的,雨英,hr肯主动告知结果已经超越大部分hr了
点赞 评论 收藏
分享
字节 飞书绩效团队 (n+2) * 15 + 1k * 12 + 1w
点赞 评论 收藏
分享
评论
3
36
分享
牛客网
牛客企业服务