博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
STL分配器allocator
阅读量:4056 次
发布时间:2019-05-25

本文共 774 字,大约阅读时间需要 2 分钟。

分配器为为容器再内存中分配空间。容器的一般默认分配器是 std::allocator ,该分配器是一个类模板。

对内存空间分配的动作(分配器,new,operator new()等)一般最后都会调用malloc() 。malloc() 再根据不同的操作系统调用其底层的API。同理释放内存对应的free()。

malloc(size)分配的内存:

在这里插入图片描述

除了要求的size意外malloc(size)还会在头尾添加一些额外开销(记录整块的大小用于free(),内存对齐等)。所以当size较大时有效内存所占比例大,malloc()的空间使用率更好。

分配器一般含有两个重要的函数allocate() 和deallocate()。用于分配和释放内存。

std::allocator的allocate() 调用operator new() ,而operator new() 又调用malloc() 。deallocate() 调用operator delete() ,operator delete()再调用free()。并没有做其余优化。它对容器中每一个元素都调用一次malloc()。

GNU 2.9中std容器使用的分配器为:alloc

每次malloc(size)一块较大的内存,再将其切割成许多大小不同的小块给容器中每个元素使用,减少malloc() 次数,从而降低额外开销(额外开销只在malloc()时产生)

在这里插入图片描述
在这里插入图片描述
但是GNU 4.9中std容器使用的分配器为std::allocator
其为容器内每一个元素分配内存最终都要调用malloc()。(为什么不用alloc了?可能有缺陷?)
GNU4.9中之前的alloc还在,被改名为__pool_alloc。使用方法:vector<int, __gnu_cxx::__pool_alloc > v;

转载地址:http://jyeci.baihongyu.com/

你可能感兴趣的文章
SQL2012报错:cannot find one or more cpmponents
查看>>
关于runat = “server”
查看>>
【opencv实战】图像素描及卡通化
查看>>
【opencv实战】哈哈镜
查看>>
【opencv学习笔记】004之Mat对象及其应用详解
查看>>
C++常用数学函数
查看>>
【积跬步以至千里】Windows无法访问指定设备,路径或文件,您可能没有合适的权限访问
查看>>
【数据结构基础笔记】第一章绪论之基本概念
查看>>
【数据结构基础笔记】第一章绪论之算法及算法分析
查看>>
【数据结构基础笔记】第二章线性表之基本概念与类型定义
查看>>
【数据结构基础笔记】第二章线性表之顺序表
查看>>
C++报错:无法打开文件“路径\Debug\文件名.exe”
查看>>
【数据结构基础笔记】第二章线性表之单链表
查看>>
【积跬步以至千里】Excel行列互换
查看>>
【YOLO学习笔记】之YOLO初体验
查看>>
【YOLO学习笔记】之YOLO配置文件详解
查看>>
【YOLO学习笔记】之YOLO v1 论文笔记1(超详细:翻译+理解)
查看>>
【YOLO学习笔记】之YOLO v1 论文笔记2(超详细:翻译+理解)
查看>>
【YOLO学习笔记——数据集】之一YOLO数据集制作1(含LabelImg工具讲解)
查看>>
【积跬步以至千里】pdf转word后数字和英文格式别扭,无法修改
查看>>