C++内存管理
小瓶子的笔记本
这个作者很懒,什么都没留下…
展开
-
【C++内存管理】GCC4.9 array_allocator 源码分析
array_allocator 直接就是用 std::array 来做的内存管理。先分配一大块数组,然后客户需要多少内存,就直接从数组中拿去,实现较为简单先看看它的数据成员:array_type* _M_array; size_type _M_used;array_type 就是 std::array 类型,也就是 _M_array 可以看作是一个指向数组的指针。_M_used 就是标定数组中有多少内存块是分配出去了的。allocator 函数源码: pointerall原创 2020-06-09 20:00:59 · 346 阅读 · 0 评论 -
【C++内存管理】loki::allocator 源码分析
loki 是书籍 《Modern C++ Design》配套发行的一个 C++ 代码库,里面对模板的使用发挥到了极致,对设计模式进行了代码实现。这里是 loki 库的源码。ps. 有空是不是应该把里面的设计模式的代码学习学习, hahahahloki 库里面有两个文件,SmallObj.h 以及 SmallObj.cpp,就是一个内存管理的内,可以单独使用。下面就其源码进行分析。1. 类层次结构SmallObj 文件里面有三个类:Chunk,FixedAllocator 和 SmallObj原创 2020-06-07 16:12:43 · 980 阅读 · 1 评论 -
【C++内存管理】G2.9 std::alloc 源码分析
在 上一篇 中,对 std::alloc 的运行时状态进行了分析,这篇再结合上一篇,深入代码分析。常量定义enum { __ALIGN = 8 }; // block 的间隔enum { __MAX_BYTES = 128 }; // block 的最大 bytesenum { __NFREELISTS = __MAX_BYTES / __ALIGN }; //free-lists 的个数这里它用的是 enum 定原创 2020-06-01 20:35:59 · 329 阅读 · 0 评论 -
【C++内存管理】G2.9 std::alloc 运行模式
在上一篇里面说到,vs 的标准分配器 std::allocator 并没有做内存管理。gnu的历史版本 2.9 中的标准分配器 std::allocator 也没有做内存管理,但是它提供的 extended allocator 中,std::alloc 就是一个做了内存管理的版本。在 gnu 新版本中,__gnu_cxx::__pool_alloc<_Ty> 就是 G2.9 的 std::alloc 的化身。 下面先分析以下 std::alloc 的运行模式,再下一篇分析具体代码。 不过原创 2020-05-29 18:11:07 · 1082 阅读 · 1 评论 -
【C++内存管理】vs2017 标准分配器实现
vs2017 标准库中,std::allocator 的实现如下:template<class _Ty>class allocator{//... void deallocate(_Ty * const _Ptr, const size_t _Count) { // deallocate object at _Ptr // no overflow check on the following multiply; we assume _Allocate did that check原创 2020-05-27 15:51:10 · 588 阅读 · 0 评论 -
【C++内存管理】内存管理实例 (三 ) —— static allocator
在上一篇中,利用 Embeded pointer 的概念为某一个类设计出了一个内存管理模块。在掌握这种方法之后,以后只要有哪一个类需要做内存管理,都可以采用那种方法,重载 operator new 和 operator delete 函数。这个时候,我们自然的想到把内存分配的这个模块抽象出来,在其中做统一的处理。这个时候就有了这个 static allocator 的版本。设计一个新的 cla...原创 2020-05-22 09:59:39 · 480 阅读 · 0 评论 -
【C++内存管理】内存管理实例 (一 ) —— 简单形式
内存管理无外乎希望提高两方面性能:提高运行效率。可以通过减少 malloc 函数调用的次数来提高运行效率。提高空间利用率。减少浪费。每次通过 new 分配的内存块上下两个部分都带有 cookie,记录着这块内存的大小等相关信息。可以通过分配一大块内存池,在将其中分为一小块一小块以供对象实例存放,这样的话,只在这一大块的头尾存在 cookie,中间部分省掉了很多 cookie 的占用内存,提高...原创 2020-04-18 17:47:19 · 525 阅读 · 1 评论 -
【C++内存管理】placement new 重载示例
可以为 operator new 写出多个重载版本,但是每一个版本的第一个参数都必须为 size_t 类型。其余的参数以 new 所指定的 placement arguements 为初值,出现在 new(…) 小括号里面的就是所谓的 placement arguements.比如我们可以继续为 Foo 类型写 operator new 重载:class Foo{public: Foo(...原创 2020-04-18 15:23:49 · 713 阅读 · 0 评论 -
【C++内存管理】operator new重载示例
可以对 operator new 进行重载,实现自己的内存分配方式和资源释放。下面是示例代码:class Foo{public: Foo() : _id(0) { cout << "default constructor. id = " << _id << endl; } Foo(int i) : _id(i) { cout <&l...原创 2020-04-18 09:54:02 · 336 阅读 · 0 评论 -
【C++内存管理】new expression
当我们用 new 去动态分配内存时:complex *pc = new complex(1, 2);编译器会为我们转为如下实现:complex *pc;try{ void *mem = operator new(sizeof(complex)); //allocate pc = static_cast<complex*>(mem); //cast pc->c...原创 2020-04-17 21:42:25 · 282 阅读 · 0 评论 -
【C++内存管理】placement new
placement new 允许我们在已有的内存上调用构造函数创建 object,如下用法://先分配内存char *buf = new char[sizeof(complex) * 3];//在 buf 指针所指的位置调用 complex 的构造函数,complex *pc = new(buf)complex(1, 2);...//释放内存delete[] buf;背后编译器...原创 2020-04-17 20:02:46 · 229 阅读 · 0 评论 -
【C++内存管理】array new 和 array delete
使用方法使用 new 加 [] 可以为数组分配内存,使用方法如下:Complex *pca = new Complex[3];这样的话,就分配了一块3个 Complex 大小的内存,并且分别调用三次 Complex 的默认构造函数。当不在使用这块内存时,需要搭配 delete[] 使用,它会先三次调用 Complex 的析构函数,然后将这块内存给释放掉:delete[] pca;...原创 2020-04-17 16:54:36 · 468 阅读 · 0 评论 -
【C++内存管理】内存管理实例 (二) —— Embeded pointer
在上一篇的内存管理实例中,我们用一个 next 指针将分配的一整块内存中的每个对象大小的内存块链接成链表,客户端需要动态分配对象内存时,直接从链表上获取,减少了不必要的 cookie 内存消耗。但是缺点也很明显,就是增加了每个对象的 next 指针的内存消耗。我们可以看看什么时候会使用到 next 指针:当分配了一大块内存,这一大块内存上的每个对象大小的小内存块需要用 next 指针串在一起,...原创 2020-04-26 21:03:22 · 411 阅读 · 0 评论