这里继续学习基于配置器之上的一些内存基本处理工具。主要剖析 SGI STL 源码(http ://www.sgi.com/tech/stl/download.html v3.3)中的几个内存处理函数(由函数名可知,是对未初始化空间的初始化操作,即通过复制或赋值的方式初始化未初始化的空间):
uninitialized_copy(),uninitialized_copy_n(),uninitialized_fill(),uninitialized_fill_n()。
先学习 uninitiated_copy()
1 | //stl source code(v3.3) |
上面两个是对两种特化类型的处理,下面为泛化版本
1 | template <class _InputIter, class _ForwardIter> |
POD就是标量型别或传统的C struct 型别,POD 型别必然拥有 trivial ctor / dtor / copy / assignment 函数,因此我们可以对POD型别进行判断,从而决议出最有效率的初值填写手法
不难发现上面 uninitiated_copy() 后,返回的是指向 copy 后的区块末端。
uninitiated_copy_n() 则是向指定欲初始化空间初始化(复制)指定大小已初始化空间的指定值(有点拗口)。
1 | template <class _InputIter, class _Size, class _ForwardIter> |
上面函数都是返回 pair 对组类型。其实就是返回两个值,一个是 “只读” 型别的迭代器(_InputIter),一个是允许 “写入型” 的迭代器(_ForwardIter)。
下面这个函数 uninitiated_fill() 和 uninitiated_copy() 操作很像,只不过前者是赋值,后者是复制。
1 | //迭代器类型为“写入型”。该函数的功能就是给迭代器指定范围内赋值 |
下面的函数 uninitiated_fill_n() 则是向指定欲初始化空间初始化(赋值)指定大小空间的指定值。
1 | template <class _ForwardIter, class _Size, class _Tp> |
STL 定义的这几个全局函数(包括前面介绍的用于构造的 construct() 和 用于析构的 destroy()),作用于未初始化空间上,这样的功能对于容器的实现很有帮助。