STL的空间配置器(allocator)
创始人
2024-05-31 18:52:51
0

简答:

在C++STL中,空间配置器便是用来实现内存空间(一般是内存,也可以是硬盘等空间)分配的工具,他与容器联系紧密,每一种容器的空间分配都是通过空间分配器alloctor实现的。


解析:

1.两种C++类对象实例化方式的异同在c++中,创建类对象一般分为两种方式:
一种是直接利用构造函数,直接构造类对象,如Test test();另一种是通过new来实例化一个类对象,如Test* pTest=new Test;
那么,这两种方式有什么异同点呢?
我们知道,内存分配主要有三种方式:
(1)静态存储区分配:内存在程序编译的时候已经分配好,这块内存在程序的整个运行空间内都存在。如全局变量,静态变量等。
(2)栈空间分配:程序在运行期间,函数内的局部变量通过栈空间来分配存储(函数调用栈),当函数执行完毕返回时,相对应的栈空间被立即回收。主要是局部变量。
(3)堆空间分配:程序在运行期间,通过在堆空间上为数据分配存储空间,通过malloc和new创建的对象都是从堆空间分配内存,这类空间需要程序员自己来管理,必须通过free()或者是delete()函数对堆空间进行释放,否则会造成内存溢出。
那么,从内存空间分配的角度来对这两种方式的区别,就比较容易区分:
(1)对于第一种方式来说,是直接通过调用Test类的构造函数来实例化Test类对象的,如果该实例化对象是一个局部变量,则其是在栈空间分配相应的存储空间。
(2)对于第二种方式来说,就显得比较复杂。这里主要以new类对象来说明一下。new一个类对象,其实是执行了两步操作:首先,调用new在堆空间分配内存,然后调用类的构造函数构造对象的内容;同样,使用delete释放时,也是经历了两个步骤:首先调用类的析构函数释放类对象,然后调用delete释放堆空间。2.C++STL空间配置器实现
很容易想象,为了实现空间配置器,完全可以利用new和delete函数并对其进行封装实现STL的空间配置器,的确可以这样。但是,为了最大化提升效率,SGI STL版本并没有简单的这样做,而是采取了一定的措施,实现了更加高效复杂的空间分配策略。由于以上的构造都分为两部分,所以,在SGI STL中,将对象的构造切分开来,分成空间配置和对象构造两部分。
内存配置操作:通过alloc::allocate()
实现内存释放操作:通过alloc::deallocate()
实现对象构造操作:通过::construct()
实现对象释放操作:通过::destroy()
实现关于内存空间的配置与释放,SGI STL采用了两级配置器:一级配置器主要是考虑大块内存空间,利用malloc和free实现;二级配置器主要是考虑小块内存空间而设计的(为了最大化解决内存碎片问题,进而提升效率),采用链表free_list来维护内存池(memory pool),free_list通过union结构实现,空闲的内存块互相挂接在一块,内存块一旦被使用,则被从链表中剔除,易于维护。

相关内容

热门资讯

突来的危机!伊朗发飙了!这一次... 伊朗发飙了!这一次,美国有点悬据英国《卫报》网站6月30日报道,伊朗总统佩泽希齐扬向法国总统马克龙表...
沪深股市交易提示(7月4日) (转自:科创100ETF基金)今日停牌提示:长龄液压(605389) 今日复牌提示:松炀资源(603...
天风证券:阿洛酮糖获批国内新食... 转自:证券时报人民财讯7月4日电,天风证券研报表示,D-阿洛酮糖获批新食品原料,标志国内应用许可正式...
成都市气象台解除暴雨预警信号,... 转自:四川在线四川在线记者 陈婷成都市民请注意!成都市气象台预计,今天早高峰时段无特别明显降水,市区...
西藏林周县科技赋能青稞产业,亩... 近日,记者跟随“‘绿镜头·发现中国’中央媒体走基层看气象”主题采访报道组,来到西藏青稞气象服务中心所...
王毅谈中欧建交50年重要启示 来源:新华社新华社柏林7月3日电当地时间7月3日,中共中央政治局委员、外交部长王毅在柏林同德国外长瓦...
为振兴发展引来更多金融“活水” 为振兴发展引来更多金融“活水”——2025创投辽宁发展大会扫描  本报记者  胡海林  资本是创新和...
中信证券:预计2025-203... 每经AI快讯,中信证券研报表示,海底光缆敷设于海底8000米,用于连接全球不同地区数据中心,进行信息...
省委、省政府号召向中国高铁工人... 转自:河工新闻网张雪松在调试设备  2010年4月15日,河北省委、省政府作出《关于开展向张雪松同志...
抗洪救灾 “村BA”和“村超”... 唱着欢送歌曲,为救援队员脖子上挂上彩带,切开一块块清甜可口的西瓜递给亲人……洪灾过后的“村超”之城贵...