【2014-06-18】C++ STL读书笔记:allocator
[历史归档]本文原发布于 cstriker1407.info 个人博客内容为历史存档仅供参考。发布时间2014-06-18 标题C STL读书笔记allocator分类编程 / C C / C STL 标签CC·stl·allocatorC STL读书笔记allocator备注std::allocatornew\_allocator.h备注本读书笔记基于侯捷先生的《STL源码剖析》截图和注释版权均属于原作者所有。本读书笔记中的源码部分直接拷贝自SGI-STL部分代码删除了头部的版权注释但代码版权属于原作者。小弟初看stl很多代码都不是太懂注释可能有很多错误还请路过的各位大牛多多给予指导。std::allocator我们以vector为例子看下它的默认的allocator是什么。我们首先看下 vector 里面什么也没有但是有一行#includebits/stl_vector.h然后我们再看下 stl_vector.h 部分内容如下templatetypename_Tp,typename_Allocstd::allocator_Tpclassvector:protected_Vector_base_Tp,_Alloc。。。。。通过这个我们可以知道vector默认的allocator是std::allocator也可以大致的推断出其他的容器应该也是这个。我们打开 allocator.h 部分内容如下// Define the base class to std::allocator.#includebits/callocator.h_GLIBCXX_BEGIN_NAMESPACE(std)templatetypename_Tpclassallocator:public__glibcxx_base_allocator_Tp。。。。通过这里我们可以知道std::allocator就在这个文件中继承自【 __glibcxx_base_allocator 】。这里我们先跳过这个文件继续include。我们打开 callocator.h 部分内容如下#includeext/new_allocator.h#define__glibcxx_base_allocator__gnu_cxx::new_allocator这里我们知道【 __glibcxx_base_allocator 】其实就是【 __gnu_cxx::new_allocator 】继续打开 new_allocator.h 部分内容如下_GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)templatetypename_Tpclassnew_allocator{。。。。。看到这里我们就可以大致的知道stl中的默认allocator的继承关系和代码位置了。然后我们开始注释代码去掉了头部版权注释new_allocator.h#includenew#includebits/functexcept.h#includebits/move.h//在命名空间__gnu_cxx中_GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)usingstd::size_t;usingstd::ptrdiff_t;/** * brief An allocator that uses global new, as per [20.4]. * ingroup allocators * * This is precisely the allocator defined in the C Standard. * - all allocation calls operator new * - all deallocation calls operator delete *///《STL源码剖析》P43页对此作了简要介绍根据C标准如下typedef和函数是必须定义的。templatetypename_Tpclassnew_allocator{public:typedefsize_t size_type;typedefptrdiff_t difference_type;typedef_Tp*pointer;typedefconst_Tp*const_pointer;typedef_Tpreference;typedefconst_Tpconst_reference;typedef_Tp value_type;templatetypename_Tp1structrebind{typedefnew_allocator_Tp1other;};new_allocator()throw(){}new_allocator(constnew_allocator)throw(){}templatetypename_Tp1new_allocator(constnew_allocator_Tp1)throw(){}~new_allocator()throw(){}pointeraddress(reference __x)const{return__x;}const_pointeraddress(const_reference __x)const{return__x;}// NB: __n is permitted to be 0. The C standard says nothing// about what the return value is when __n 0.pointerallocate(size_type __n,constvoid*0){if(__nthis-max_size())std::__throw_bad_alloc();//申请空间时直接调用operator new,也就是我们平常使用的new操作符申请空间returnstatic_cast_Tp*(::operatornew(__n*sizeof(_Tp)));}// __p is not permitted to be a null pointer.voiddeallocate(pointer __p,size_type){::operatordelete(__p);}//申请空间时直接调用operator delete,也就是我们平常使用的delete操作符释放空间size_typemax_size()constthrow(){returnsize_t(-1)/sizeof(_Tp);}// _GLIBCXX_RESOLVE_LIB_DEFECTS// 402. wrong new expression in allocator::constructvoidconstruct(pointer __p,const_Tp__val){::new((void*)__p)_Tp(__val);}//调用placement new相当于在已有内存上直接调用构造函数#ifdef__GXX_EXPERIMENTAL_CXX0X__templatetypename..._Argsvoidconstruct(pointer __p,_Args...__args){::new((void*)__p)_Tp(std::forward_Args(__args)...);}#endifvoiddestroy(pointer __p){__p-~_Tp();}//直接调用实例的析构函数};templatetypename_Tpinlinebooloperator(constnew_allocator_Tp,constnew_allocator_Tp){returntrue;}templatetypename_Tpinlinebooloperator!(constnew_allocator_Tp,constnew_allocator_Tp){returnfalse;}_GLIBCXX_END_NAMESPACE

相关新闻

单调栈算法精讲:从原理到实战,解决LeetCode高频问题

单调栈算法精讲:从原理到实战,解决LeetCode高频问题

1. 从“排队”到“解题”:为什么单调栈是算法面试的常客如果你刷过LeetCode或者准备过技术面试,大概率在“下一个更大元素”、“柱状图中最大矩形”、“每日温度”这类题目里见过它的身影。单调栈(Monotonic Stack)这个名字听起来…

2026/8/7 3:29:01 阅读更多 →
从零构建高质量语料库:NLP工程师的实战指南与避坑手册

从零构建高质量语料库:NLP工程师的实战指南与避坑手册

1. 项目概述:从“语料”到“语料库”的认知跃迁 “语料”和“语料库”,这两个词在自然语言处理、语言学乃至现在大热的AI领域里,出场频率极高。乍一看,它们似乎只是“材料”和“仓库”的关系,简单明了。但在我过去十多…

2026/8/7 3:28:00 阅读更多 →
链表没有尽头时怎样找到入口:Floyd 指针的反直觉辟谣h

链表没有尽头时怎样找到入口:Floyd 指针的反直觉辟谣h

快指针一次走两步、慢指针一次走一步,能判断单链表有环;但“相遇点就是入口”“快指针一定多跑一圈”都不准确。本文从路程同余推导 Floyd 算法第二阶段,用 C17 构造、定位并安全拆除环,覆盖自环、无环和头节点入环,并…

2026/8/7 3:28:00 阅读更多 →

最新新闻

OpenClaw智能体持久化记忆:从本地存储到向量数据库混合架构实战

OpenClaw智能体持久化记忆:从本地存储到向量数据库混合架构实战

1. 项目概述:从“失忆”到“长记性”的AI智能体进化最近在折腾本地AI智能体,特别是OpenClaw,很多朋友都遇到了一个共同的痛点:这玩意儿怎么跟金鱼似的,聊完就忘?今天跟你聊了电商客服的退货政策&#xff0c…

2026/8/7 4:17:27 阅读更多 →
3步解锁多平台直播:告别切换烦恼的完整方案

3步解锁多平台直播:告别切换烦恼的完整方案

3步解锁多平台直播:告别切换烦恼的完整方案 【免费下载链接】obs-multi-rtmp OBS複数サイト同時配信プラグイン 项目地址: https://gitcode.com/gh_mirrors/ob/obs-multi-rtmp 你是否曾经为了在不同直播平台同时推流而手忙脚乱?每次切换平台都要重…

2026/8/7 4:17:27 阅读更多 →
hostname与hosts本地域名解析实操

hostname与hosts本地域名解析实操

hostname与hosts本地域名解析实操一、实验目的配置本地hosts解析,自定义域名指向IP,实现本地域名访问测试。二、实验环境CentOS7.9系统三、操作步骤编辑本地解析文件Bashvim /etc/hosts添加解析规则Plaintext192.168.1.100 test.linux.com测试解析Bashpi…

2026/8/7 4:17:27 阅读更多 →
Java日期计算:Date与LocalDate转换及天数、月数、年数计算实践

Java日期计算:Date与LocalDate转换及天数、月数、年数计算实践

1. 项目概述:为什么我们需要精确的日期计算?在Java开发中,处理日期和时间是再常见不过的需求。无论是计算用户的会员有效期、统计两个事件之间的间隔,还是生成按年、月、日维度的报表,都离不开对Date类或其替代品&…

2026/8/7 4:17:27 阅读更多 →
基于CMSIS-Toolbox与VS Code构建现代化嵌入式开发环境

基于CMSIS-Toolbox与VS Code构建现代化嵌入式开发环境

1. 从零到一:为什么我们需要一个专属的嵌入式编译调试环境?如果你和我一样,长期在嵌入式开发的一线摸爬滚打,那你一定经历过这样的场景:手头一个基于Arm Cortex-M内核的STM32项目,代码在Keil MDK里编译得好…

2026/8/7 4:17:27 阅读更多 →
PLC硬件架构与编程语言解析:从CPU到扫描周期,掌握工业自动化核心

PLC硬件架构与编程语言解析:从CPU到扫描周期,掌握工业自动化核心

1. 从“黑盒子”到工业大脑:PLC到底是什么?如果你在工厂车间、自动化产线或者大型设备控制室里待过,大概率会听到工程师们频繁提起一个词:PLC。它可能是一个挂在电柜里、指示灯闪烁的铁盒子,也可能是工程师电脑屏幕上复…

2026/8/7 4:16:26 阅读更多 →

日新闻

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南 【免费下载链接】scrcpy Display and control your Android device 项目地址: https://gitcode.com/GitHub_Trending/sc/scrcpy 想要将Android手机屏幕完美投射到电脑上,享受大屏操作的自…

2026/8/7 0:00:19 阅读更多 →
如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南

如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南

如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南 【免费下载链接】tom-select Tom Select is a lightweight (~16kb gzipped) hybrid of a textbox and select box. Forked from selectize.js to provide a framework agnostic autocomplete widget wi…

2026/8/7 0:00:19 阅读更多 →
5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件

5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件

5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件 【免费下载链接】nsz NSZ - Homebrew compatible NSP/XCI compressor/decompressor 项目地址: https://gitcode.com/gh_mirrors/ns/nsz 你是否在为Nintendo Switch游戏文件占用大量存储…

2026/8/7 0:00:19 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/6 22:02:27 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/6 22:02:27 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/6 22:02:27 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/5 23:28:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/6 22:02:28 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/5 23:46:51 阅读更多 →