STL之内存管理

STL以泛型思维为基础,提供了6大组件:容器(containers)、算法(algorithms)、迭代器(iterators)、仿函数(functors)、适配器(adapters)、分配器(allocators)。

容器:

vector、list、deque、set、map等,用来存放数据。从实现的角度来看,容器就是一种class template。

算法:

sort、find、copy等,从实现的角度来看,算法就是一种function template。

迭代器:

从实现的角度来看,迭代器是一种将operator*、operator->、operator++、operator--等指针相关操作予以重载的class template。

仿函数:

从实现的角度来看,仿函数是一种重载了operator()的class或class template。

适配器:

一种用来修饰容器或仿函数或迭代器接口的东西。

分配器:

负责空间的配置与管理。

容器通过分配器取得数据存储空间,算法通过迭代器存取容器内容,仿函数可以协助算法完成不同的策略变化,适配器可以修饰或套接仿函数。

STL分配器:std::alloc

四大函数:

alloc::allocate()          //内存分配

alloc::deallocate()      //内存释放

::construct()             //对象构造

::destroy()               //对象析构

内存管理:

STL使用两级分配器进行内存管理。请求大于128 bytes使用一级分配器,请求小于128 bytes使用二级分配器。一级分配器通过malloc()、free()进行内存的分配与释放。

二级分配器比较复杂。

__default_alloc_template {
    free_list[16];        //16个链表
    char  *start_free;   //内存池开始位置
    char  *end_free;}   //内存池结束位置
};

二级分配器维护16个list,分别负责大小为8,16,24,32,40,48,56,64,72,80,88,96,104,112,120,128 bytes的小块内存的分配与回收。

具体过程如下:

请求小于128 bytes时,根据请求大小,找到对应链表。链表不空,取下一块内存分配,分配过程结束。否则求助内存池。成功,分配结束。否则通过malloc调用请求heap,成功,分配结束。否则

在16个链表中位于之前对应链表后面的链表中寻找可用内存块,成功,分配结束。否则求助一级配置器。

时间: 2024-10-05 14:01:09

STL之内存管理的相关文章

STL内存管理

过年在家无事看了<STL源码剖析>,开学了将看过的东西总结一下,以防忘记. 先从STL的内存管理开始总结.掌管STL内存控制的是一个叫空间适配器(alloc)的东西.STL有两个空间适配器,SGI标准空间适配器(allocate)和SGI特殊的空间适配器(alloc),前者只是对c++的new和delete进行了简单的封装.下面主要介绍的是alloc空间适配器. 一般而言,c++的内存配置和释放操作是这样的: class Foo {...} Foo* pf = new Foo: delete

STL内存管理器的分配策略

STL提供了很多泛型容器,如vector,list和map.程序员在使用这些容器时只需关心何时往容器内塞对象,而不用关心如何管理内存,需要用多少内存,这些STL容器极大地方便了C++程序的编写.例如可以通过以下语句创建一个vector,它实际上是一个按需增长的动态数组,其每个元素的类型为int整型: stl::vector<int> array; 拥有这样一个动态数组后,用户只需要调用push_back方法往里面添加对象,而不需要考虑需要多少内存: array.push_back(10); a

stl内存管理allocator(转)

1. STL容器简介 STL提供了很多泛型容器,如vector,list和map.程序员在使用这些容器时只需关心何时往容器内塞对象,而不用关心如何管理内存,需要用多少内存,这些STL容器极大地方便了C++程序的编写.例如可以通过以下语句创建一个vector,它实际上是一个按需增长的动态数组,其每个元素的类型为int整型: stl::vector<int> array; 拥有这样一个动态数组后,用户只需要调用push_back方法往里面添加对象,而不需要考虑需要多少内存: array.push_

图解STL内存管理的两种边界情况(STL源码剖析补充)

图解STL内存管理的两种边界情况(STL源码剖析补充) 第一种情况就是内存池剩余的小字节空间怎么处理,会不会有内存泄露,答案肯定是不会,但是这个过程是怎么处理的,以下的代码已经简化处理,直接放到VS2010里就可以运行 #include<stdio.h> #include<stdlib.h> static const size_t __ALIGN=8; static const size_t __MAX_BYTES=128; static const size_t __NFREEL

STL容器存储的内容动态分配情况下的内存管理

主要分两种情况:存储的内容是指针:存储的内容是实际对象. 看下面两段代码, typedef pair<VirObjTYPE, std::list<CheckID>*> VirObj_CheckID_pair; class LangChecker { public:     LangChecker();     ~LangChecker();         void Register(VirObjTYPE type, CheckID id); private:     std::m

(转)从内存管 理、内存泄漏、内存回收探讨C++内存管理

http://www.cr173.com/html/18898_all.html 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对 C++的痛恨,但内存管理在C++中无处不在,内存泄漏几乎在每个C++程序中都会发生,因此要想成为C++高手,内存管理一关是必须要过的,除非放弃 C++,转到Java或者.NET,他们的内存管理基本是自动的,当然你也放弃了自由和对内存的支配权,还放弃了C++超绝的性能

Object-C内存管理的理解总结

今天看到了OC的内存管理这块,觉得很亲切. 自己的习惯是尽量自己掌控程序的空间和时间,有点强迫症的感觉.用C和C++做项目的时候,时时刻刻都在操心这new和delete的配对使用和计数,学习stl和boost的时候看到了智能指针等时候,依然不是很爱使用,还是愿意坚持自己控制new和delete:后来用C#后,一直特别注意Dispose相关的动作,尽早释放对象占有的内存空间,避免无谓的占用一直到程序退出才释放. OC中系统对每个实例对象地址都记录一个引用次数(当然有特例,见另外一篇随笔),这就是引

C++内存管理(超长,例子很详细,排版很好)

[导语] 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理在C++中无处不在,内存泄漏几乎在每个C++程序中都会发生,因此要想成为C++高手,内存管理一关是必须要过的,除非放弃C++,转到Java或者.NET,他们的内存管理基本是自动的,当然你也放弃了自由和对内存的支配权,还放弃了C++超绝的性能.本期专题将从内存管理.内存泄漏.内存回收这三个方面来探讨C++内存管理问题

【转载】ogre内存管理

原文:ogre内存管理 OGRE内存分配策略相关文件及简述 OGRE提供了自己的内存分配策略,甚至为STL容器提供了新的分配策略,相关文件及简述如下: OgreMemoryAllocatedObject.h  OgreMemoryAllocatedObject.cpp // 所有使用Ogre内存分配器的类的父类 OgreMemoryAllocatorConfig.h // 配置内存分配相关规则 OgreMemoryNedAlloc.h  OgreMemoryNedAlloc.cpp // 使用n