《STL源码剖析》深入剖析理解

2023-11-09

目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加

前言
标准程序库和STL概论
空间配置器解析

提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

SGI(Silicon Graphics, Inc.)版本的C++ STL(Standard Template Library)是C++标准模板库的一个经典实现,它由Alexander Stepanov和Meng Lee于1994年设计开发,并最初发布在SGI的IRIX操作系统上。SGI STL在很大程度上影响了后来C++标准中STL的设计和实现。

学习SGI版本的C++ STL可以帮助你深入理解STL的核心概念和数据结构,下面是一些学习重点:

  1. 容器(Containers):SGI STL实现了各种常用的容器,如vector、list、deque、set、map等。学习它们的底层数据结构和实现原理,包括如何管理内存、数据存储方式、迭代器设计等。
  2. 迭代器(Iterators):迭代器是STL的核心之一,它提供了一种统一的方式来遍历容器中的元素。了解SGI STL中迭代器的设计和实现,包括迭代器的种类(input iterator、output iterator、forward iterator、bidirectional iterator、random access iterator),以及如何在容器中使用它们。
  3. 算法(Algorithms):SGI STL实现了大量的算法,如排序、查找、复制、删除等。学习这些算法的实现原理,以及它们如何与容器和迭代器进行交互,可以帮助你更好地理解STL的功能和性能。
  4. 仿函数(Functors):SGI STL中广泛使用了仿函数(也称为函数对象),它们是实现了operator()的类对象,可以像函数一样被调用。学习仿函数的设计和使用,可以帮助你了解STL中很多算法的灵活性和通用性。
  5. 分配器(Allocators):SGI STL中的容器使用了分配器来管理内存分配和释放。学习分配器的实现,包括如何定制自己的分配器,可以帮助你了解STL在内存管理方面的优化和可扩展性。
  6. 空间配置器(Memory Allocators):SGI STL中使用了空间配置器来进行底层的内存分配和释放,它是STL中内存管理的关键部分。学习空间配置器的实现,包括如何处理内存碎片和提高内存分配效率,是了解STL性能优化的重要一环。
  7. 内存管理和性能优化:SGI STL在内存管理和性能优化方面做了很多工作,学习它们的设计思路和实现方法,可以帮助你在自己的代码中做出更好的设计和优化决策。

标准程序库和STL概论

提示:这里可以添加本文要记录的大概内容:
《STL源码剖析》是由侯捷所著,是一本经典的C++ STL源码解析书籍,它深入剖析SGI版本的C++ STL源代码,解释了STL各个组件的实现原理和设计思路。以下是该书第一章的重点概述:标准程序库(Standard Library):
介绍C++标准程序库的概念和组成部分,包括STL、I/O流、字符串处理、数值处理等组件。
强调STL是标准程序库中的一个重要组成部分,它为C++程序员提供了强大的泛型编程工具。
STL的优势:

简化代码:STL允许使用泛型编程,使得代码更加简洁、灵活且易于维护。
提高效率:STL中的算法和数据结构都经过高度优化,可以提高程序的执行效率。
高度可移植性:STL的实现是独立于具体平台的,因此代码可以在不同的编译器和操作系统上运行。
STL的组成:

容器(Containers):包括vector、list、deque、set、map等,用于存储和管理数据。
算法(Algorithms):包括排序、查找、复制、删除等算法,用于操作容器中的数据。
迭代器(Iterators):用于遍历容器中的元素,提供一种统一的访问方式。
仿函数(Functors):类似于函数的对象,用于封装操作,作为算法的参数。
适配器(Adapters):用于调整容器或迭代器接口,使其能够适配特定需求。
STL的基本设计思想:

泛型编程:通过模板技术实现泛型算法和数据结构,使得它们适用于多种数据类型。
封装性:STL中的各个组件都封装在独立的类或函数中,使得代码易于重用和维护。
可扩展性:STL允许用户自定义容器、迭代器和仿函数,从而满足特定的需求。
STL的实现方式:

STL的设计和实现主要基于模板元编程(Template Metaprogramming)和模板特化(Template Specialization)。
涉及到的一些技术和概念包括:迭代器设计、分配器(Allocators)、空间配置器(Memory Allocators)等。
第一章主要介绍了C++标准程序库的概念、STL的优势和组成部分,以及STL的基本设计思想和实现方式。它为后续章节深入探讨STL的各个组件奠定了基础,对于理解STL的核心思想和学习STL的源码具有重要的意义。

第二章 空间配置器解析

PJ 空间配置器

容器需要配置空间来存放数据。 空间配置器最本质的四个功能:

allocator 申请空间
deallocator 释放空间
construct 构造对象
destroy 摧毁对象
#pragma once
这是PJ版本的STL空间配置器,并没有完全遵守STL规则。 
#include<iostream>
using namespace std;

namespace CC {
	template<class T>
	T* _allocate(size_t n, T*) {			
		set_new_handler(0);				//防止申请内存空间失败
		T* tmp = (T*)::operator new(sizeof(T) * n);		//malloc
		if (tmp == 0) {
			cerr << "out of memory" << endl;
			exit(1);
		}
		return tmp;
	}
	template<class T>
	void _deallocate(T* p) {
		::operator delete(p);
	}
	template<class T>
	void _construct(T* p,const T& value) {
		new(p) T(value);				//将value作为初始值开辟一块空间指向p
	}

	template<class T>
	void _destroy(T* p) {
		p->~T();		
	}

	template<class T >
	class Alloctor
	{
	public:
		pointer allocate(size_type n, const void* hint = 0) {		//申请空间
			return (pointer)_allocate(n, 0);  
		}
		void deallocate(pointer p, size_type n) {					//释放空间
			_deallocate(p);
		}
		void construct(pointer p, const T& value) {					//构造对象
			_construct(p,value);
		}
		void destroy(pointer p) {									//摧毁对象	
			_destroy(p);
		}
	public:
		typedef T value;
		typedef T* pointer;
		typedef const T& const_pointer;
		typedef T& reference;
		typedef const T& const_reference;
		typedef const size_t  size_type;
	};
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《STL源码剖析》深入剖析理解 的相关文章

  • 不同提供商的相同 EDMX 文件

    我正在开发一个项目 其中有一个本地数据库 SQL CE 在不存在与服务器的连接的情况下用作缓冲区 在服务器上我想使用相同的数据库布局 当然 我想使用服务器和客户端上可用的 Common dll 中的相同 EDMX 文件 在客户端中 我有一个
  • C# 中直接从 URL 获取图像尺寸

    我正在尝试使用以下代码直接从网络上获取图片的尺寸 string image http www hephaestusproject com csharp3 png byte imageData new WebClient DownloadDa
  • 读取大文件并制作字典

    我有一个大文件 我需要读取它并从中制作字典 我希望这一切能够尽可能快 然而我的Python代码太慢了 这是一个显示问题的最小示例 首先制作一些假数据 paste lt seq 20000000 lt seq 2 20000001 gt la
  • 如何部署包含第三方 DLL 文件的 C# 应用程序?

    首先 我对部署了解不多 我希望我的问题有意义 我需要将 C 应用程序安装 部署到多个桌面 它需要一个第三方 DLL 文件 一个 C 库 lpsolve55 dll 对于那些感兴趣的人 它是一个免费的 MIP LP 求解器 请参阅 lpsol
  • C语言中没有循环可以打印数组吗?

    例如 在Python中 如果我们将一个列表作为数组 它会直接用一行代码打印整个数组 有什么办法可以用C语言实现同样的事情吗 简短回答 No 对表格上几乎所有问题的简短回答 用 C 语言做 X 工作能像用 Python 一样简单吗 No 长答
  • 多个线程访问一个变量

    我在正在读的一本教科书中发现了这个问题 下面也给出了解决方案 我无法理解最小值怎么可能是 2 为什么一个线程不能读取 0 而所有其他线程都执行并写入 1 而无论是1还是2 最后写入的线程仍然必须完成自己的循环 int n 0 int mai
  • 使用 catch all 字典属性将 json 序列化为对象

    我想使用 JSON net 反序列化为对象 但将未映射的属性放入字典属性中 是否可以 例如给定 json one 1 two 2 three 3 和 C 类 public class Mapped public int One get se
  • 从二进制文件读取字节到 long int

    我有两个问题 我有二进制文件的数据 我想使用 read 函数读取前 8 个字节以签署 long int 但我不能 你知道我该怎么做吗 如何直接读取一块数据到字符串中 我可以像所示那样阅读吗 前任 ifstream is is open te
  • 主构造函数不再在 VS2015 中编译

    直到今天 我可以使用主构造函数 例如 public class Test string text private string mText text 为了能够做到这一点 在以前的 Visual Studio CTP 中 我必须将其添加到 c
  • Web 文本编辑器中的 RTF 格式

    网络上是否有支持 RTF 格式文档输入的文本编辑器 我知道这对 webdev 来说有点奇怪 但我需要从数据库中读取 RTF 文档 并在基于 Web 的文本编辑器中对其进行编辑 然后将其存储回 RTF 中 在我在转换工具上投入太多资金之前 我
  • 确定相关词的编程方式?

    使用网络服务或软件库 我希望能够识别与词根相关的单词 例如 座位 和 安全带 共享词根 座位 但 西雅图 不会被视为匹配 简单的字符串比较对于这类事情似乎是不可行的 除了定义我自己的字典之外 是否有任何库或 Web 服务不仅可以返回单词定义
  • 删除数组时出现访问冲突异常

    删除分配的内存时 出现 访问冲突读取位置 异常 如下所示 我有一个针对 Visual Studio 2010 工具集 v100 C 编译器编译的本机 dll 我有一个针对它的托管 dll 包装器 它是针对工具集 v90 编译的 因为我想以
  • 动态菜单创建IoC

    我想知道是否有人知道我如何创建如何使用 AutoFac 之类的东西来让我动态地允许 dll 创建自己的表单和菜单项以在运行时调用它们 所以如果我有一个 员工 dll 新入门表格 证书表格 供应商 dll 供应商详细信息来自 产品形态 在我的
  • 按 Enter 继续

    这不起作用 string temp cout lt lt Press Enter to Continue cin gt gt temp cout lt lt Press Enter to Continue cin ignore 或更好 in
  • 如何使 WinForms UserControl 填充其容器的大小

    我正在尝试创建一个多布局主屏幕应用程序 我在顶部有一些按钮链接到应用程序的主要部分 例如模型中每个实体的管理窗口 单击这些按钮中的任何一个都会在面板中显示关联的用户控件 面板包含用户控件 而用户控件又包含用户界面 WinForms User
  • 如何使用“路径”查询 XDocument?

    我想查询一个XDocument给定路径的对象 例如 path to element I want 但我不知道如何继续 您可以使用以下方法System Xml XPath Extensions http msdn microsoft com
  • 包含从代码隐藏 (ASP.NET C#) 到 ASPX 中的图像概述的图像列表 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Web API 2.0 使用 pascalcase 模型接收驼峰式命名的 JSON 数据

    我正在尝试对我的 Web API 进行 PUT 调用 我在 WebApiConfig cs 中设置了以下内容 以处理以驼峰形式将数据发送回我的 Web 项目 config Formatters JsonFormatter Serialize
  • 是否可以检测流是否已被客户端关闭?

    简要介绍一下情况 我有一项服务可以通过套接字接收信息并发送回复 连接不安全 我想设置另一个可以为这些连接提供 TLS 的服务 这个新服务将提供单个端口并根据提供的客户端证书分发连接 我不想使用 stunnel 有几个原因 其中之一是每个接收
  • 查找和替换正则表达式问题

    感谢这里对我其他问题的所有大力帮助 我开始掌握正则表达式 但我仍然对这个一无所知 我的代码是 StreamReader reader new StreamReader fDialog FileName ToString string con

随机推荐

  • Unity 在编辑模式下退出游戏

    实现在编辑器环境下退出编辑器 在非编译器环境下退出游戏 我们需要判断当前是否在编辑器环境中 在unity中是使用预处理的方式判断当前的环境 常用的预处理标识符如下 标识符 解释 UNITY EDITOR 只在编辑器中编译 UNITY AND
  • el-popover 通过js手动控制弹出框显示、隐藏

    el popover 通过js手动控制弹出框显示 隐藏 说明 element ui 2 x中 el popover的显示隐藏有4种触发方式 click focus hover manual 分别是点击 聚焦 悬浮 手动 正常情况这几个触发方
  • 总结/笔记-逻辑函数封装

    逻辑函数拆分业务 将同一组件中独立的业务代码通过函数做封装处理 提高代码的可维护性 步骤 1 命名函数 use业务名 js 2 用函数封装业务逻辑 3 函数内 return 数据 方法 4 组件中 调用函数使用 封装业务逻辑函数 compo
  • java文件名命名的规则,Java文件名及其他命名规则

    http bbs csdn net topics 70157841 关于JAVA源文件命名的问题 Java文件命名 java程序是由类组成的 java应用程序必须有一个包含main方法的public类 main方法是程序的入口 java源文
  • UncaughtExceptionHandler加Process 让应用程序不异常崩溃退出

    我们在开发应用程序时难免会遇到出现没有被try catch抓住的RunTimeException信息 从而导致程序异常崩溃退出 大大的影响了用户体验 那么有没有什么方法能避免这一现象呢 网上一查资料 果然有 UncaughtExceptio
  • 延迟渲染到最终结果---大象无形(11.3.1)--2,PrePass预处理阶段--<2>大致工作流程

    正如上文所言 对静态物体和动态物体分别处理 一 静态物体 1 设置渲染状态 只计算像素深度 不计算颜色 具体内容是 关闭颜色写入 打开深度测试与深度写入 2 渲染三个绘制列表 1 只绘制深度的列表PositionOnlyDepthDrawL
  • java 内存同步_Java同步的内存影响

    小编典典 简而言之 就是 JSR 133的解释太过分了 这不是一个严重的问题 因为JSR 133是非规范性文档 不属于语言或JVM标准 而是 只有文档解释了一种可能的策略 该策略 足以 实现内存模型 但通常不是 必需的 最重要的是 有关 缓
  • java:变量(二)变量的基本类型

    二 整型与浮点型细节 1 组成 整型变量是由符号位和数位两部分组成 浮点变量是由符号位 指数尾 尾数位组成 整型和浮点型变量的首位都是符号位 用来表示数据的正负 2 整型浮点型变量的长度和取值范围是固定的 事实上同一语言的基本数据类型的长度
  • 云优化:您需要知道的一切

    在不考虑云优化的情况下将开发工作迁移到云端有点类似于吃 PB J 花生酱 果酱 三明治 只不过没有果酱 虽然花生酱已经够美味了 但您错过了把这一切结合在一起的要素 如果您想确保最大限度地利用您的云支出并消除任何可能拖慢速度的低效率事项 那么
  • 在idea中集成redis

    https www cnblogs com yiMro p 13529150 html SpringBoot Redis 基本配置及使用 Test public void TestRedis Jedis jedis new Jedis 19
  • [docker学习笔记] 11.docker网络模式及容器间网络通信

    docker的容器之间需要进行业务通信 11 1 默认网络 初始安装docker 之后 有三种网络 可以通过 docker network ls 查看 root localhost docker network ls NETWORK ID
  • 常用校验码(奇偶校验码、海明校验码、CRC校验码)

    常用校验码 奇偶校验码 海明校验码 CRC校验码 一 奇偶校验码二 海明校验码三 CRC校验码 计算机系统运行时 各个部之间要进行数据交换 交换的过程中 会有发生误码的可能 即0变成1或1变成0 由于计算机的储存是通过二进制代码来实现的的
  • C#连接云服务器MySql数据库

    环境 vs2017 第一步 在主窗口代码区新建一个类 用于连接数据库 在开发过程中其他窗口 常常也需要 对数据库进行操作 如果在每一个窗口的代码区域都连接一次数据库的话 就会很麻烦 所以在主窗口先用一个公共类连接了数据库 其他窗口就可以直接
  • go 进阶 请求代理相关: 一. 基于原生HTTP实现请求代理

    目录 一 代理基础概念了解 什么是正向代理 什么是反向代理 二 基于原生HTTP实现代理 简单正向代理示例 简单反向代理示例 上方代理中可能存在的问题 一 代理基础概念了解 什么是正向代理 是一种客户端的代理技术缩写为 forward pr
  • HarmonyOS云开发基础认证

    单选 答案 Cloud DB的数据同步模式包括缓存模式和本地模式 应用可以仅使用缓存模式 或者本地模式 也可以同时使用缓存模式和本地模式 正确 True Cloud DB服务在通过OnSnapshotListener类中的onSnapsho
  • MISRA-2012 规则整理

    说明 为了方便标准的对照 标题从8 1开始 目录 8 1 一个标准C环境 8 2 不使用的代码 8 3 注释 8 4 字符集 8 5 标识符 8 6 类型 8 7 常量 8 8 声明与定义 8 9 初始化 8 10 基本数据类型 8 11
  • 华为OD机试真题 整数对最小和 JavaScript java python c++ 参考解题

    题目描述 给定两个整数数组 array1 array2 数组元素按升序排列 假设从array1 array2中分别取出一个元素可构成一对元素 现在需要取出K个元素 并对取出的所有元素求和 计算和的最小值 注意 两对元素如果对应于array1
  • 在navicat中做数据库建模

    前几天 项目经理和我说要我把最近这个项目的数据表做一个关联图 我一想 这不就是数据库建模了嘛 可是公司电脑里没有power designer啊 公司电脑里还不能装外部来源的软件 这咋办 难不成要手工画图 想想就头疼 无意中就发现了navic
  • LVGL V8之flex grow

    flex grow布局 static void lv example flex 3 void lv obj t cont lv obj create lv scr act 当前活动界面创建obj对象作为容器 lv obj set size
  • 《STL源码剖析》深入剖析理解

    目录 提示 这里可以添加系列文章的所有文章的目录 目录需要自己手动添加 前言 标准程序库和STL概论 空间配置器解析 提示 写完文章后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 目录 前言 标准程序库和STL概论 空间配置器