
内存管理
发如雪-ty
一个工作多年的程序员,一直从事C++开发方面的工作,曾有幸在安防行业深耕4年,并有幸在工业检测行业工作至今已有4年,主要负责系统软件的设计与开发,个人编程的信仰:不要盲目学习酷炫的东西,最重要的依然是内功。
展开
-
c++内存管理19-G4.9 pool allocator 运行观察
G4.9和G2.9几乎一样,不同点在于:G2.9在分配内存时使用malloc:而G4.9用operator new 接管过来了,改变了流程。大致改变可以参考如下:重点在于如何使用分配器。看懂了如何使用分配器,这段就看懂了。...原创 2020-12-28 23:09:25 · 262 阅读 · 0 评论 -
c++内存管理18-G2.9 std::alloc源码剖析
如果你把我之前的文章看懂了,我想这篇文章,你花点时间,你是能看懂的。原创 2020-12-28 22:28:29 · 176 阅读 · 0 评论 -
c++内存管理17-vc6的标准分配器
我对它的评价:脱了裤子放P.原创 2020-12-09 22:32:13 · 179 阅读 · 0 评论 -
c++内存管理16-malloc的内存块布局
现在看到了吧,分配的内存,返回给你的指针,其实前后还带着其它的数据。原创 2020-12-09 22:21:47 · 197 阅读 · 0 评论 -
c++内存管理15-内存分配完了怎么办?
先看看new的源码:内存是有限的,如果使用不当,总会到了山穷水尽的时候。也就是说分配内存失败。那这个时候怎么处理,或者怎么给用户提示呢?在c++真有这么一个操作。请看其实就在最上面那个while循环处。会调用一个由set_new_handler()设置的函数。接下来做一个测试:...原创 2020-12-09 21:47:32 · 194 阅读 · 2 评论 -
C++内存管理14-main之前你所不知道的事06-结束
内存管理-main之前你所不知道的事06-结束在这里每一个header链表包含64对指针,每一对管理的大小也不同,这个模式和之前内存池的设计类似,第一个管理8个字节,第二个管理16个字节。在这里有64对指针,每一组管理16个字节的大小,第二队就管理32字节的大小,第64队就管理1024字节的大小。在这里管理的意思是将空闲的内存交给对应的组来管理。大于1024字节就交给最后一组指针管理。在之前...原创 2020-02-09 15:28:21 · 190 阅读 · 0 评论 -
c++内存管理13-winmain/main之前你所不知道的事05
winmain/main之前你所不知道的事05上一节我提到了下面一个图:左边有32个group,右边的虚拟地址空间也有32块,其实目的就是用32个group去管理这32块内存,而这32块内存是一个header,其大小为1MB.那右边每一小格代表的内存大小就为1024/32 = 32kb.然后sbh又将这32个字节的内存分成8块,如下图:那么page1=page2=…=4k。然后sbh做以...原创 2020-01-14 00:06:05 · 170 阅读 · 0 评论 -
c++内存管理12-winmain/main之前你所不知道的事04
winmain/main之前你所不知道的事04上面的设计其实都是纸上谈兵而已,只是计算大小。接下来才是真真的分配内存。前面我讲了__sbh_heap_init()的主要作用就是为了获取16个headerlist链表。每一个header负责1mb大小,它会调用Windows下的virtual alloc.需要注意的是每个headerlist有两个指针,其中一个指针指向真正的内存,另外一个指向内...原创 2020-01-12 23:48:17 · 227 阅读 · 0 评论 -
c++内存管理11-winmain/main之前你所不知道的事03
winmain/main之前你所不知道的事03接着上一节,我们该讲解_heap_alloc_base(…),这个我在01中开始就讲解了,主要是为了满足小区块服务的,超过1024就会交给系统进行分配。接下来看_sbh_alloc_block(…)其实它所做的关键动作在右下边矩形框中其中intSize就是上一节blocksize的大小,其实动作也就是做rundup动作,将大小调整为16的倍数...原创 2020-01-10 23:59:14 · 204 阅读 · 0 评论 -
c++内存管理10-winmain/main之前你所不知道的事02
winmain/main之前你所不知道的事02先看下图:上一节,我们详细介绍了_heap_init(…),_sbh_heap_init(),接下来我们先看1._ioinit()->_malloc_crt(debug):如上图,右边矩形框中是它的部分源码,其实也就是为了分配内存,但这个分配内存的工具_malloc_crt(…)有两个,一个非debug模式下,如有上角的#define...原创 2020-01-06 23:50:47 · 241 阅读 · 0 评论 -
c++内存管理09-winmain/main之前你所不知道的事01
winmain/main之前你所不知道的事01其实main开始之前执行了很多操作如下图○1-○9:先看看下面的代码:代码解读:后面三行是操作系统的内核,然后调用mainCRTStarup,这是一个c标准库函数,绿色框框里面的就是它做的事情。1):在这里先讲解_heap_alloc_dbg(…),看右边小图如果分配的大小小于等于_sbh_threshold(它是一个常量,大小为1016...原创 2019-12-29 22:44:07 · 216 阅读 · 0 评论 -
C++内存管理08 GCC std::alloc内存碎片处理以及资源枯竭处理
GCC std::alloc内存碎片处理以及资源枯竭处理一.内存碎片:先看如下图:其中蓝色部分80字节的大小是战备池剩余的,接下来要申请104个字节,那么余下的部分也就是80个字节不够怎么办?那么这80个字节就是内存碎片了。处理过程如下:先处理内存碎片:80落在第free_list[9]个链表上(108),所以把这80个字节挂在第free_list[9]链表上。如下:2.分配内存...原创 2019-12-24 23:33:44 · 671 阅读 · 0 评论 -
C++内存管理07 GCC std::alloc 运行模式解读
GCC std::alloc 运行模式解读首先看如下图,这个图是侯捷老师画的,我向他致敬前面几章我写的内存管理器,一次只能管理一个内存链表。在这里alloc将会管理16种不同的链表。Free_list[16],其中管理关系如下规则:0-81-162-243-32…14-12015-128运行模式解释情景1:首先要声明一点,在这里alloc会自动将用户传入的内存大小和自身设定...原创 2019-12-22 23:52:33 · 561 阅读 · 0 评论 -
C++内存管理06-vc6,vs2013的标准分配器评析
C++内存管理6-标准分配器之vc6,vs2013评析先看看vc6allocate的源码:template<class _Ty> inline_Ty _FARQ *_Allocate(_PDFT _N, _Ty _FARQ *){if (_N < 0) _N = 0; return ((_Ty _FARQ *)operator new((_SIZT)_N * si...原创 2019-12-19 22:04:32 · 238 阅读 · 0 评论 -
C++内存管理05-标准分配器之基础函数模板类模板
C++内存管理4-标准分配器之基础函数模板类模板先介绍下泛型编程顾名思义,泛型编程就是支持多种类型的通用代码,说多种其实不严谨,应该是与类型无关的通用代码。目的是为了提高代码的复用率。2.函数模板:先骑自行车:template<typename T>void swapTy(T &a,T &b){ T temp = a; a = b; b = te...原创 2019-12-07 23:17:09 · 186 阅读 · 0 评论 -
C++ 内存管理04-我也能像MFC那样写出DECLARE_MESSAGE_MAP()
如果你熟悉MFC,你肯定见过下面的语句:以上是图↑#define _CRT_SECURE_NO_WARNINGS#include<iostream>using namespace std;#define DECLARE_POOL_ALLOC() \ public: \static void *operator new(size_t size) \{\ retu...原创 2019-11-23 22:26:26 · 179 阅读 · 0 评论 -
C++ 内存管理03-内存池03(自己写一个allocator)
通过上节的介绍已经改进了内存设计第一版的缺点,但是依然有一个问题,那就是,我们是学面向对象的,不可能每建立一个类,就都写一个内存管理,做重复的动作,那就太没意思了,于是就想着自己封装一个内存管理的工具,专门用来做内存管理。代码如下:class allocatorex{private: struct obj { struct obj *next; };public: void ...原创 2019-11-23 18:47:21 · 454 阅读 · 0 评论 -
C++ 内存管理03-内存池02
内存池02通过上一节的介绍,你应该能够对内存管理有个大概的了解,上一节提到为了设计内存池增加了一个指针next,但它额为增加了4个字节,这不是我们所需要的。于是对它进行了优化,先看代码和云心结果#define _CRT_SECURE_NO_WARNINGS#include<iostream>using namespace std;class foo{public: ...原创 2019-11-22 20:52:17 · 201 阅读 · 0 评论 -
C++ 内存管理03-内存池01
内存池01通过我前面的讲解,你已经知道每调用malloc一次都会产生cookie或者其他消耗资源的东西,它们是占用内存的,总之,减少malloc 的调用总是好的。于是为了解决这个问题,内存池出场了。假设你需要new 1000个对象,如果执行new 1000次,显示就意味着会执行malloc 1000次,而产生额外的资源比如cookie也就有1000次,而报号上下两个cookie,分别占4个字节...原创 2019-11-19 21:54:07 · 176 阅读 · 0 评论 -
C++内存管理02->接管三把刀为内存池做准备
内存管理02->接管三把刀为内存池做准备其实我们做内存管理就是自己重载new。接下来我们先看看能不能接管new,自己掌控。1. 先接管全局newvoid *MyMalloc(size_t size){ return malloc(size);}void MyDelete(void *ptr){ free(ptr);}inline void *operator...原创 2019-11-18 22:36:40 · 229 阅读 · 0 评论 -
C++ 内存管理01->三把大刀
三把大刀第一把 大刀:newclass point_ty{4. private:5. int x;6. int y;7. public:8. point_ty(int a, int b)9. {10. x = a;11. y = b;12. }13. void show()14. {15. cout << "x:" <&l...原创 2019-11-17 22:23:52 · 204 阅读 · 0 评论