C++进阶—STL之空间配置器

C++空间配置器 基于著名书籍和自我学习得出的空间配置器精华知识 阅读详情

第一章:什么是空间配置器

空间配置器,顾名思义就是为各个容器高效的管理空间(空间的申请与回收)的,在默默地工作。虽然在常规使用STL时,可能用不到它,但站在学习研究的角度,学习它的实现原理对我们有很大的帮助。

第二章:为什么需要空间配置器

前面在模拟实现vector、list、map、unordered_map等容器时,所有需要空间的地方都是通过new申请的,虽然代码可以正常运行,但是有以下不足之处:

  • 空间申请与释放需要用户自己管理,容易造成内存泄漏
  • 频繁向系统申请小块内存块,容易造成内存碎片
  • 频繁向系统申请小块内存,影响程序运行效率
  • 直接使用malloc与new进行申请,每块空间前有额外空间浪费
  • 申请空间失败怎么应对
  • 代码结构比较混乱,代码复用率不高
  • 未考虑线程安全问题

因此需要设计一块高效的内存管理机制。

第三章:SGI-STL空间配置器实现原理

以上提到的几点不足之处,最主要还是:频繁向系统申请小块内存造成的。那什么才算是小块内存?SGI-STL以128作为小块内存与大块内存的分界线,将空间配置器其分为两级结构,一级空间配置器处理大块内存,二级空间配置器处理小块内存。

3.1 一级空间配置器

一级空间配置器原理非常简单,直接对malloc与free进行了封装,并增加了C++中set_new_handle思想。

template <int inst>
class __malloc_alloc_template {
private:
	static void* oom_malloc(size_t);
public:
	// 对malloc的封装
	static void* allocate(size_t n) {
		// 申请空间成功,直接返回,失败交由oom_malloc处理
		void* result = malloc(n);
		if (0 == result)
			result = oom_malloc(n);
		return result;
	}
	// 对free的封装
	static void deallocate(void* p, size_t /* n */) {
		free(p);
	}
	// 模拟set_new_handle
	// 该函数的参数为函数指针,返回值类型也为函数指针
	// void (*   set_malloc_handler( void (*f)() ) )()
	static void (*set_malloc_handler(void (*f)()))()
	{
		void (*old)() = __malloc_alloc_oom_handler;
		__malloc_alloc_oom_handler = f;
		return(old);
	}
};
// malloc申请空间失败时代用该函数
template <int inst>
void* __malloc_alloc_template<inst>::oom_malloc(size_t n) {
	void (*my_malloc_handler)();
	void* result;
	for (;;) {
		// 检测用户是否设置空间不足应对措施,如果没有设置,抛异常,模式new的方式
		my_malloc_handler = __malloc_alloc_oom_handler;
		if (0 == my_malloc_handler) {
			__THROW_BAD_ALLOC;
		}

		// 如果设置,执行用户提供的空间不足应对措施
		(*my_malloc_handler)();

		// 继续申请空间,可能就会申请成功
		result = malloc(n);
		if (result)
			return(result);
	}
}
typedef __malloc_alloc_template<0> malloc_alloc;

3.2 二级空间配置器

二级空间配置器专门负责处理小于128字节的小块内存。如何才能提升小块内存的申请与释放的方式呢?SGI-STL采用了内存池的技术来提高申请空间的速度以及减少额外空间的浪费,采用哈希桶的方式来提高用户获取空间的速度与高效管理。

3.2.1 内存池

内存池就是:先申请一块比较大的内存块已做备用,当需要内存时,直接到内存池中去去,当池中空间不够时,再向内存中去取,当用户不用时,直接还回内存池即可。避免了频繁向系统申请小块内存所造成的效率低、内存碎片以及额外浪费的问题。

请思考几个问题:

  1. 当用户需要空间时,能否直接从内存池中大块空间中直接截取?为什么?
  2. 对用户归还的空间能否直接拼接在大块内存前?
  3. 对用户归还的空间如何进行管理?
  4. 不断切割会有什么后果?

3.2.2 SGI-STL中二级空间配置器设计

SGI-STL中的二级空间配置器使用了内存池技术,但没有采用链表的方式对用户已经归还的空间进行管理(因为用户申请空间时在查找合适的小块内存时效率比较低),而是采用了哈希桶的方式进行管理。那是否需要128桶个空间来管理用户已经归还的内存块呢?答案是不需要,因为用户申请的空间基本都是4的整数倍,其他大小的空间几乎很少用到。因此:SGI-STL将用户申请的内存块向上对齐到了8的整数倍(请思考为什么是8的整数倍,而不是4。因为前4个字节存的是该哈希桶下个内存块的起始地址)。

3.2.3 SGI-STL二级空间配置器之空间申请

1. 前期的准备
// 去掉代码中繁琐的部分
template <int inst>
class __default_alloc_template {
private:
	enum { __ALIGN = 8 };  // 如果用户所需内存不是8的整数倍,向上对齐到8的整数倍
	enum { __MAX_BYTES = 128 }; // 大小内存块的分界线
	enum { __NFREELISTS = __MAX_BYTES / __ALIGN };  // 采用哈希桶保存小块内存时所需桶的个数

	// 如果用户所需内存块不是8的整数倍,向上对齐到8的整数倍
	static size_t ROUND_UP(size_t bytes) {
		return (((bytes)+__ALIGN - 1) & ~(__ALIGN - 1));
	}

private:
	// 用联合体来维护链表结构----同学们可以思考下此处为什么没有使用结构体
	union obj {
		union obj* free_list_link;
		char client_data[1];  /* The client sees this. */
	};

private:
	static obj* free_list[__NFREELISTS];

	// 哈希函数,根据用户提供字节数找到对应的桶号
	static size_t FREELIST_INDEX(size_t bytes) {
		return (((bytes)+__ALIGN - 1) / __ALIGN - 1);
	}

	// start_free与end_free用来标记内存池中大块内存的起始与末尾位置
	static char* start_free;
	static char* end_free;

	// 用来记录该空间配置器已经想系统索要了多少的内存块
	static size_t heap_size;

	// ...
};

2. 申请空间

// 函数功能:向空间配置器索要空间
// 参数n: 用户所需空间字节数
// 返回值:返回空间的首地址
static void* allocate(size_t n) {
	obj* __VOLATILE* my_free_list;
	obj* __RESTRICT result;
	// 检测用户所需空间释放超过128(即是否为小块内存)
	if (n > (size_t)__MAX_BYTES) {
		// 不是小块内存交由一级空间配置器处理
		return (malloc_alloc::allocate(n));
	}

	// 根据用户所需字节找到对应的桶号
	my_free_list = free_list + FREELIST_INDEX(n);
	result = *my_free_list;

	// 如果该桶中没有内存块时,向该桶中补充空间
	if (result == 0) {
		// 将n向上对齐到8的整数被,保证向桶中补充内存块时,内存块一定是8的整数倍
		void* r = refill(ROUND_UP(n));
		return r;
	}

	// 维护桶中剩余内存块的链式关系
	*my_free_list = result->free_list_link;
	return (result);
};

3. 填充内存块

// 函数功能:向哈希桶中补充空间
// 参数n:小块内存字节数
// 返回值:首个小块内存的首地址
template <int inst>
void* __default_alloc_template<inst>::refill(size_t n) {
	// 一次性向内存池索要20个n字节的小块内存
	int nobjs = 20;
	char* chunk = chunk_alloc(n, nobjs);

	obj** my_free_list;
	obj* result;
	obj* current_obj, * next_obj;
	int i;
	// 如果只要了一块,直接返回给用户使用
	if (1 == nobjs)
		return(chunk);

	// 找到对应的桶号
	my_free_list = free_list + FREELIST_INDEX(n);
	// 将第一块返回值用户,其他块连接在对应的桶中
	// 注:此处代码逻辑比较简单,但标准库实现稍微有点复杂,同学们可以自己实现
	result = (obj*)chunk;
	*my_free_list = next_obj = (obj*)(chunk + n);
	for (i = 1; ; i++) {
		current_obj = next_obj;
		next_obj = (obj*)((char*)next_obj + n);
		if (nobjs - 1 == i) {
			current_obj->free_list_link = 0;
			break;
		}
		else {
			current_obj->free_list_link = next_obj;
		}
	}

	return(result);
}

4. 向内存池中索要空间

template <int inst>
char* __default_alloc_template<inst>::chunk_alloc(size_t size, int& nobjs) {
	// 计算nobjs个size字节内存块的总大小以及内存池中剩余空间总大小
	char* result;
	size_t total_bytes = size * nobjs;
	size_t bytes_left = end_free - start_free;
	// 如果内存池可以提供total_bytes字节,返回
	if (bytes_left >= total_bytes) {
		result = start_free;
		start_free += total_bytes;
		return(result);
	}
	else if (bytes_left >= size) {
		// nobjs块无法提供,但是至少可以提供1块size字节内存块,提供后返回
		nobjs = bytes_left / size;
		total_bytes = size * nobjs;
		result = start_free;
		start_free += total_bytes;
		return(result);
	}
	else {
		// 内存池空间不足,连一块小块村内都不能提供
		// 向系统堆求助,往内存池中补充空间
		// 计算向内存中补充空间大小:本次空间总大小两倍 + 向系统申请总大小/16
		size_t bytes_to_get = 2 * total_bytes + ROUND_UP(heap_size >> 4);

		// 如果内存池有剩余空间(该空间一定是8的整数倍),将该空间挂到对应哈希桶中
		if (bytes_left > 0) {
			// 找对用哈希桶,将剩余空间挂在其上
			obj** my_free_list = free_list +
				FREELIST_INDEX(bytes_left);
			((obj*)start_free)->free_list_link = *my_free_list;
			*my_ree_list = (obj*)start_free;
		}

		// 通过系统堆向内存池补充空间,如果补充成功,递归继续分配
		start_free = (char*)malloc(bytes_to_get);
		if (0 == start_free) {
			// 通过系统堆补充空间失败,在哈希桶中找是否有没有使用的较大的内存块
			int i;
			obj** my_free_list, * p;
			for (i = size; i <= __MAX_BYTES; i += __ALIGN) {
				my_free_list = free_list + FREELIST_INDEX(i);
				p = *my_free_list;

				// 如果有,将该内存块补充进内存池,递归继续分配
				if (0 != p) {
					*my_free_list = p->free_list_link;
					start_free = (char*)p;
					end_free = start_free + i;
					return(chunk_alloc(size, nobjs));
				}
			}

			// 山穷水尽,只能向一级空间配置器求助
			// 注意:此处一定要将end_free置空,因为一级空间配置器一旦抛异常就会出问题
			end_free = 0;
			start_free = (char*)malloc_alloc::allocate(bytes_to_get);
		}

		// 通过系统堆向内存池补充空间成功,更新信息并继续分配
		heap_size += bytes_to_get;
		end_free = start_free + bytes_to_get;
		return(chunk_alloc(size, nobjs));
	}
}

3.2.4 SGI-STL二级空间配置器之空间回收

// 函数功能:用户将空间归还给空间配置器
// 参数:p空间首地址   n空间总大小
static void deallocate(void* p, size_t n) {
	obj* q = (obj*)p;
	obj** my_free_list;
	// 如果空间不是小块内存,交给一级空间配置器回收
	if (n > (size_t)__MAX_BYTES) {
		malloc_alloc::deallocate(p, n);
		return;
	}
	// 找到对应的哈希桶,将内存挂在哈希桶中
	my_free_list = free_list + FREELIST_INDEX(n);
	q->free_list_link = *my_free_list;
	*my_free_list = q;
}

3.3 空间配置器的默认选择

SGI-STL默认使用一级还是二级空间配置器,通过USE_MALLOC宏进行控制:

#ifdef __USE_MALLOC
typedef malloc_alloc alloc;
typedef malloc_alloc single_client_alloc;
#else
// 二级空间配置器定义
#endif

在SGI_STL中该宏没有定义,因此:默认情况下SGI_STL使用二级空间配置器

3.4 空间配置器的再次封装

在C++中,用户所需空间可能是任意类型的,有单个对象空间,有连续空间,每次让用户自己计算所需空间总大小不是很友好,因此SGI-STL将空间配置器重新再封装了一层

// T: 元素类型
// Alloc: 空间配置器
// 注意:该类只负责申请与归还对象的空间,不否则空间中对象的构造与析构
template<class T, class Alloc>
class simple_alloc {
public:
	// 申请n个T类型对象大小的空间
	static T* allocate(size_t n) {
		return 0 == n ? 0 : (T*)Alloc::allocate(n * sizeof(T));
	}
	// 申请一个T类型对象大小的空间
	static T* allocate(void) {
		return (T*)Alloc::allocate(sizeof(T));
	}
	// 释放n个T类型对象大小的空间
	static void deallocate(T* p, size_t n) {
		if (0 != n)
			Alloc::deallocate(p, n * sizeof(T));
	}
	// 释放一个T类型对象大小的空间
	static void deallocate(T* p) {
		Alloc::deallocate(p, sizeof(T));
	}
};

3.5 对象的构造与释放

一切为了效率考虑,SGI-STL决定将空间申请释放和对象的构造析构两个过程分离开,因为有些对象的构造不需要调用析构函数,销毁时不需要调用析构函数,将该过程分离开可以提高程序的性能:

// 归还空间时,先先调用该函数将对象中资源清理掉
template <class T>
inline void destroy(T* pointer) {
	pointer->~T();
}
// 空间申请好后调用该函数:利用placement-new完成对象的构造
template <class T1, class T2>
inline void construct(T1* p, const T2& value) {
	new (p) T1(value);
}

注意:

  1. 在释放对象时,需要根据对象的类型确定是否调用析构函数(类型萃取)
  2. 对象的类型可以通过迭代器获萃取到

以上两步在实现时稍微有点复杂,有兴趣的同学可参考STL源码。

第四章:与容器结合

本例子给出list与空间配置器是如何结合的
template <class T, class Alloc = alloc>
class list {
	// ...
	// 实例化空间配置器
	typedef simple_alloc<list_node, Alloc> list_node_allocator;
	// ...
protected:
	link_type get_node() {
		// 调用空间配置器接口先申请节点的空间
		return list_node_allocator::allocate();
	}
	// 将节点归还给空间配置器
	void put_node(link_type p) {
		list_node_allocator::deallocate(p);
	}
	// 创建节点:1. 申请空间 2. 完成节点构造
	link_type create_node(const T& x) {
		link_type p = get_node();
		construct(&p->data, x);
		return p;
	}
	// 销毁节点: 1. 调用析构函数清理节点中资源 2. 将节点空间归还给空间配置器
	void destroy_node(link_type p) {
		destroy(&p->data);
		put_node(p);
	}
	// ...
	iterator insert(iterator position, const T& x) {
		link_type tmp = create_node(x);
		tmp->next = position.node;
		tmp->prev = position.node->prev;
		(link_type(position.node->prev))->next = tmp;
		position.node->prev = tmp;
		return tmp;
	}
	iterator erase(iterator position) {
		link_type next_node = link_type(position.node->next);
		link_type prev_node = link_type(position.node->prev);
		prev_node->next = next_node;
		next_node->prev = prev_node;
		destroy_node(position.node);
		return iterator(next_node);
	}
	// ...
};

Python学习第1天:初识Python Python 作为目前最流行的编程语言之一,凭借其简洁优雅的语法和强大的生态系统,成为了无数开发者的首选。本系列文章将带你从零基础入门,逐步掌握 Python 编程的核心技能。今天我们先来认识 Python,并安装好开发环境。Python(英式发音:/ˈpaɪθən/;美式发音:/ˈpaɪθɑːn/)是由荷兰人吉多·范罗苏姆(Guido von Rossum)发明的一种编程语言,是目前世界上最受欢迎和拥有最多用户的编程语言。 阅读详情

相关推荐

机器视觉/将HIK海康面阵相机连接Halcon软件

本文简述了如何将海康面阵相机连接到Halcon软件中进行实时取图的过程。

Dahe.qu 4866

C++ STL(第三篇:空间配置器)

1、概述 以STL运用的角度而言,空间配置器是最不需要介绍的,它总是藏在一切组件的背后,默默工作。整个STL的操作对象都存放在容器之中(vertor、list),而容器一定需要配置空间以放置资料,这就是空间配置器的作用。 虽然STL提供了让我们自定义空间配置器的接口,但是不建议自己定义,因为标准提供的空间配置器是安全的,且效率也不错的。所以我们使用时,一般都会使用默认的配置器。如下: templa...

weixin_39640298的博客 2795

多个MOS管并联应用场景的四大要点

动态运行时,阈值电压Vgsth最低的MOS管首先打开,最后关闭。这种MOS管一般会占据更多的开关损耗,并且在开关转换过程中,承担了更高的电应力。

VBsemi的博客 3748

【C++知识点总结全系列 (06)】:STL六大组件总结- 配置器、容器、迭代器、适配器、算法和仿函数

1.STL六大组件内在的逻辑关系;2.配置器:什么是配置器、配置器的作用、allocator类的详细介绍;3容器:什么是容器、容器的作用、序列容器(array、deque、forward_list、list、vector等)、关联容器(pair、map、set、multimap、map、multiset、set等); 3.迭代器:什么是迭代器、迭代器作用、迭代器类型、迭代器使用;4.适配器:什么是适配器、有哪些、作用等;5.算法::什么是算法、STL中有哪些常见的算法;6.仿函数:什么是仿函数、作用、使用;

qq_42279379的博客 1080

vscode中使用PlatformIO创建工程加载慢

解决使用VSCODE+PlatformIO中,第一次新建工程一直加载的问题

Reasally的博客 4974

使用qt+PaddleOCR做一个OCR软件demo

文章目录使用qt+PaddleOCR做一个OCR软件demo效果展示1 建立环境1.1 vs项目环境1.2 qtcreator项目环境1.2.1 源代码整理1.2.2 依赖项整理如下1.2.3 模型文件如下1.2.4 在.pro文件中设置依赖库的模式1.2.5 pro文件中添加.h和.lib2 在工程代码中添加截图功能2.1 新建截图类并连接信号2.2 QImage转cv::Mat3 在工程代码中集成PaddleOCR3.1 初始化PaddleOCR3.2 修改文字识别类的run函数,增加一个返回结果的值的

ShareProgress的博客 9305

C++中STL用法总结

1.1 什么是STL? STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库。它被容纳于C++标准程序库(C++ Standard Library)中,是ANSI/ISO C++标准中最新的也是极具革命性的一部分。该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。为广大C++程序员们提供了一个可扩展的应用框架,高度体现

满城风絮 11万+

免疫治疗新思路:用COMPASS算法挖掘单细胞数据中的代谢靶点(含差异分析技巧)

本文介绍了如何利用COMPASS算法从单细胞转录组数据中系统推断免疫细胞的代谢活性,为肿瘤免疫治疗提供新的靶点发现思路。文章详细阐述了COMPASS结合流平衡分析的核心原理,并提供了从差异分析到可成药性评估的完整转化路径,旨在帮助研究者精准定位代谢弱点,开发新型免疫代谢疗法。

weixin_29275257的博客 366

C++进阶(12)附加学习:STL之空间配置器(了解)

附加学习:STL之空间配置器(了解)

2301_79907403的博客 392

GLMM(广义线性混合模型)原理以及分析步骤

广义线性混合模型(GLMM)是生态与进化研究中处理非正态数据的定制化工具,能同时分析固定效应和随机效应。它通过链接函数连接响应变量与预测因子,支持二项分布、泊松分布等非正态数据。研究流程包括:明确分析目标(固定效应影响与随机效应方差)、选择合适变量与分布、数据验证、参数估算(需根据模型复杂度选择PQL、拉普拉斯近似等方法)及模型优化(检验过离散与残差,通过信息准则或假设检验筛选最优模型)。GLMM能有效解决传统方法无法处理的"伪重复"和推广性问题,为复杂生物数据提供可靠分析框架。

wewil_lwin的博客 4974

Android P车机添加屏幕多指全局自定义手势操作

参照原生状态栏全局下拉手势拦截,实现屏幕全局多指手势响应操作,并对手势进行转换为KeyEvent,以便项目自定义手势行为或应用拦截手势行为。

shusuanly的博客 1251

【初阶C++】STL简介

STL 全称Standard Template Library,标准模板库,是 C++ 国际标准库中体量最大、最核心的组成部分。它不只是一套可以直接复用的代码组件,更是一套标准化、基于泛型编程思想搭建的数据结构 + 算法一体化软件开发框架。STL 是依托 C++ 模板实现的标准数据结构与算法框架,全称标准模板库;STL 存在四大历史版本,SGI-GCC 版本开源、可读性高,是源码学习首选;VS 配套 PJ 版本闭源,不适合阅读底层;

wuqingyigexiaoba的博客 511

2025年最新雷电模拟器9.22安装Magisk面具和LSPosed框架完整图文教程 文章末尾附所需软件下载

操作环境:雷电模拟器9.0.22 虚拟系统版本android 91、设置-其他设置-Root权限-开启2、设置-性能设置-System.vmdk可写入3、安装Magisk-18a0b94a-delta(25205).apk,运行并给予root权限4、选择右上角安装弹出“允许“magisk Delta”访问您设备上的照片、媒体内容和文件吗?“选择允许,然后结束magisk进程。5、从新运行magisk选择右上角安装-选择修补boot镜像中的vbmeta和安装到Recovery。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 7092

C++ STL系统整理

目录 一、前言 二、STL大体总览 三、详细整理 一、容器与适配器 一、string 二、vector  三、stack  四、set  五、map 一、前言 学校课程进度太慢,自学的知识又太零碎,所以我决定每周写一篇这样成体系的文章,一来给自己一点压力、也方便记忆查阅,二来也便于后来人一栏CS全貌,方便学习。本套文章重点讲应用,多敲代码,不讲玄而又玄的纯理论,因为各种理论都...

TriAlley的博客 390

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【C++】STL之空间配置器

空间配置器,顾名思义就是为各个容器高效的管理空间(空间的申请与回收)的,在默默地工作。虽然在常规使用STL时,可能用不到它,但站在学习研究的角度,学习它的实现原理对我们有很大的帮助。

fight_p的博客 2833

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【C++】STL 之空间配置器 | STL 总结

本篇博客主要讲解了 STL 的空间配置器、定长内存池与 malloc 的效率对比以及 STL 六大组件内在联系的总结等等。

joy.728的博客 2705

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

STL——空间配置器

目录 前言 一.概念 二.优点 三.空间配置器原理 3.1 一级空间配置器 3.2 二级空间配置器 3.2.1 内存池技术 3.2.2 哈希桶技术 四.内存碎片问题 4.1 外碎片 4.2 内碎片 五.具体细节 5.1 申请空间 5.2 填充内存块 5.3 向内存池中索要空间 前言 我们知道STL容器在不断保存...

weixin_57023347的博客 3201

【C++】STL之空间配置器(了解)

什么是空间配置器。

Elena's Blog 2101

【C++】STL空间配置器

容器,算法,迭代器, 空间配置器,适配器,仿函数。为各个容器进行高效的内存管理(内存的申请与回收)的。

一点一点变好 1526

STL空间配置器allocator详解

stl六大组件简介我们知道,stl有容器,空间配置器,适配器,迭代器,仿函数以及算法这6个组件,它们六者关系大概如下:容器通过配置器取得数据存储空间,算法通过迭代器获取容器内容,仿函数可以协助算法完成不同的策略变化,配接器可以修饰或套界仿函数。侯捷在《STL源码剖析》一书讲到:因此我们需要先去学习空间配置器。预备知识一般来说,我们习惯的C++内存配置和释放操作是这样的:class A {}; A*

xy913741894的博客 1万+

【C++学习】STL之空间配置器之一级空间配置器

STL空间配置器学习

2301_77509762的博客 1385

[C++][STL之空间配置器]了解

[C++][STL之空间配置器]了解

SnowK博客 3575

C++的STL之空间配置器

空间配置器,顾名思义就是为各个容器高效的管理空间(空间的申请与回收)的,在默默地工作。虽然在常规使用STL时,可能用不到它,但站在学习研究的角度,学习它的实现原理对我们有很大的帮助。

ZerO_on的博客 742

【C++ 复习总结】STL | 容器 | 迭代器 | 算法 | 仿函数 | 空间配置器 | 内存池

6大组件:容器、算法、迭代器、仿函数(函数对象)、适配器、空间配置器 【C++】学习已经接近尾声了,这篇文章里都是面试复习的知识点,在排版界面方面可能会有点乱,博主没有把精力放在这些上,主要是一些干货,帮助那些需要面试的小伙伴以及回顾一些重点知识。

choice~的博客 2210

C++STL - 容器空间配置器allocator的原理

知识的学习在于点滴记录,坚持不懈;知识的学习要有深度和广度,不能只流于表面,坐井观天;知识要善于总结,不仅能够理解,更知道如何表达! 目录实现一个简单的vector容器容器面临的问题空间配置器介绍实现带空间配置器的vector容器SGI STL一级,二级空间配置器的实现 实现一个简单的vector容器 C++ STL所有容器的实现都需要依赖一个空间配置器allocator,虽然我们平时使用容器...

大秦坑王的专栏 4478
上一篇: C++进阶—C++的IO流
下一篇: Linux系统编程—Linux基础指令
Awkwardx
博客等级 码龄5年 341粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值