目录
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
前言
标准程序库和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的核心概念和数据结构,下面是一些学习重点:
- 容器(Containers):SGI STL实现了各种常用的容器,如vector、list、deque、set、map等。学习它们的底层数据结构和实现原理,包括如何管理内存、数据存储方式、迭代器设计等。
- 迭代器(Iterators):迭代器是STL的核心之一,它提供了一种统一的方式来遍历容器中的元素。了解SGI STL中迭代器的设计和实现,包括迭代器的种类(input iterator、output iterator、forward iterator、bidirectional iterator、random access iterator),以及如何在容器中使用它们。
- 算法(Algorithms):SGI STL实现了大量的算法,如排序、查找、复制、删除等。学习这些算法的实现原理,以及它们如何与容器和迭代器进行交互,可以帮助你更好地理解STL的功能和性能。
- 仿函数(Functors):SGI STL中广泛使用了仿函数(也称为函数对象),它们是实现了operator()的类对象,可以像函数一样被调用。学习仿函数的设计和使用,可以帮助你了解STL中很多算法的灵活性和通用性。
- 分配器(Allocators):SGI STL中的容器使用了分配器来管理内存分配和释放。学习分配器的实现,包括如何定制自己的分配器,可以帮助你了解STL在内存管理方面的优化和可扩展性。
- 空间配置器(Memory Allocators):SGI STL中使用了空间配置器来进行底层的内存分配和释放,它是STL中内存管理的关键部分。学习空间配置器的实现,包括如何处理内存碎片和提高内存分配效率,是了解STL性能优化的重要一环。
- 内存管理和性能优化: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;
};
}