STL之内存处理
说明:本文仅供学习交流,转载请标明出处,欢迎转载!
STL中与内存配置相关的类是allocator类,头文件为:#include<alllocator>这是一个模板类,用于内存的分配、对象的构造、对象的析构和空间的删除。本文主要介绍下相关的函数。
内存空间的分配:allocate函数
allocate函数原型为:iter allocate(n,T*)。分配足以容纳n个T对象的空间,返回指向所分配空间的首地址。
对象的构造:construct函数
construct函数原型为:void construct(T1 *p,const T& value)。用值value去初始化p所指向的地址。
对象的析构:destroy函数
destroy函数原型为:void destory(T *p),析构p所指向的对象。
内存空间的释放:deallocate函数
deallocate函数原型为:void deallocate(T *p,size_type n)。将p所指向的n个T类型对象所占用的内存释放掉。
以下的几个函数中。我们用“已知”表示“已经构造”,用“未知”表示“尚未构造”,所谓“未构造”指的是“已分配的空间尚未使用“。
将已知范围的元素拷贝到还有一个未知区域:uninitialized_copy函数
uninitialized_copy函数原型为:iter uninitialzed_copy(b,e,b1),将迭代器范围[b,e)所指向的元素依次拷贝到[b1,b1+(e-b) )的区域,返回值为iter=b1+(e-b)所指向的空间。
将某个值去填充一个未知区域:uninitialized_fill
uninitialized_fill函数原型为:void unitialized_fill(b,e,t)。用值t去填充迭代器范围[b,e)所指向的区域。
用n个同样值去填充某个未知区域:uninitialized_fill_n
uninitialized_fill_n函数原型为:iter uninitialized_fill(b,n,t),用值t去填充迭代器范围[b,b+n)所指向的区域,返回迭代器 b+n。
Notice:后三个uninitialized_xxx函数的作用都是用批量初始化一个未知区域(即未使用区域),这三个函数的内部实现中有两个值得注意的地方:
1.严格遵守"commit or rollback"原则。该原则规定,在批量初始化过程中。要么产生全部的必要元素。要么不产生一个元素,即要么不做,做了就做好做全。
2.在初始化过程中,会先推断待初始化的元素类型是否为内置类型,若为内置类型POD(Plain Old Data),则直接调用更加底层的函数,上面三个函数相应的底层函数分别为:memmove(b1,b,e-b)、fill(b,e,t)和fill(b,n,x)。若数据类型为其它类型,则循环调用construct(iter,t)函数,这样做的目的是为了提高效率。
參考文献:
[1]《C++primer 第4版》
[2]《STL源代码剖析 侯捷》
STL之内存处理的更多相关文章
- STL的内存管理
SGI STL 的内存管理 http://www.cnblogs.com/sld666666/archive/2010/07/01/1769448.html 1. 好多废话 在分析完nginx的内存池 ...
- STL之内存处理工具
STL处理内存主要是使用五个全局函数construct,deconstruct,construct实现: template<typename T1,tyname T2> void cons ...
- C++ STL vector 内存分配
vector为了支持快速的随机访问,vector容器的元素以连续方式存放,每一个元素都紧挨着前一个元素存储. 当vector添加一个元素时,为了满足连续存放这个特性,都需要重新分配空间.拷贝元素.撤销 ...
- [转]STL的内存分配器
题记:内存管理一直是C/C++程序的红灯区.关于内存管理的话题,大致有两类侧重点,一类是内存的正确使用,例如C++中new和delete应该成对出现,用RAII技巧管理内存资源,auto_ptr等方面 ...
- STL vector 内存释放
最近在论坛看到一个提问帖子,问题是vector中存储了对象的指针,调用clear后这些指针如何删除? class Test { public: Test() {} ~Test() { cout < ...
- SGI STL中内存池的实现
最近这两天研究了一下SGI STL中的内存池, 网上对于这一块的讲解很多, 但是要么讲的不完整, 要么讲的不够简单(至少对于我这样的初学者来讲是这样的...), 所以接下来我将把我对于对于SGI ST ...
- STL之内存管理
STL以泛型思维为基础,提供了6大组件:容器(containers).算法(algorithms).迭代器(iterators).仿函数(functors).适配器(adapters).分配器(all ...
- 关于 stl的内存分配的深浅拷贝
http://blog.csdn.net/u012501459/article/details/44132147
- C++STL内存管理方法(g++版)
STL作为C++的经典作品,一直备受人们关注.本文主要介绍STL的内存管理策略. 早期的STL内存管理 第一次接触STL源码是看侯捷先生的<STL源码剖析>,此书通俗易懂,剖析透彻,是极佳 ...
随机推荐
- Web页面切图和CSS注意事项
一.Asp.net中的线程池设置 在Asp.net的服务处理中,每当服务器收到一个请求,HttpRuntime将从HttpApplication池中获取一个HttpApplication对象处理此请求 ...
- STL List::sort() 解析
看侯捷翻译那本<STL源码剖析>中list内置sort的算法,书中注释说是quick sort,看了半天没看明白, template <class T, class Alloc> ...
- Callable、Future&阻塞队列&阻塞栈
Callable.Future 简单应用 在Java5之前,线程是没有返回值的,常常为了“有”返回值,破费周折,而且代码很不好写.或者干脆绕过这道坎,走别的路了.现在Java终于有可返回值的任务( ...
- [转] SSH免密码登陆以及穿越跳板机
原文链接:http://www.cnblogs.com/lucantang/p/3315329.html SSH免密码登陆以及穿越跳板机 1. 免密码直连 [user@hostA ~] $ssh ...
- leetcode第一刷_Integer to Roman
这道题当时不会写,是參照discuss写的. 首先要弄明确罗马数字的规则,这个在国外难道是常识吗.为什么题干一点都没讲.. 4000以下一共同拥有以下几种符号:"M", " ...
- 用Java发送HTML格式邮件测试类(支持中文)
代码由纯Java写成,支持中文,一目了然,只要将Main函数中的相关信息填写正确就直接用了,便于修改,可以在此类基础上任意扩展成自己的类. 注意做HTML形式的邮件,最好把HTML,CSS都写全,只写 ...
- (排序)快速排序QuickSort
主要内容: 1.算法思想 2.快速排序算法 3.划分算法partition 4.快排过程图解 5.完整代码 1.算法思想 快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序.它采用了一 ...
- WPF 同一个程序 只允许 同时运行一个
方法2 当程序已经运行了 再运行这个程序时,则显示当前这个窗体 http://code.3rbang.com/cshape-run-one/ VS2013附件:http://fil ...
- InitialContext和lookup(转)
原文地址:http://wxg6203.iteye.com/blog/680830 最近因为工作需要开始学习Ejb3,遇到了一个让我很郁闷的事情,做一下小小的总结——小心new InitialCont ...
- 算法笔记_111:第五届蓝桥杯软件类省赛真题(Java本科A组)试题解答
目录 1 猜年龄 2 李白打酒 3 神奇算式 4 写日志 5 锦标赛 6 六角填数 7 绳圈 8 兰顿蚂蚁 9 斐波那契 10 波动数列 前言:以下试题解答代码部分仅供参考,若有不当之处,还请路 ...