在C++ STL的头文件<memory>中,标准配置器的声明形式如下:
标准配置器使用全局operator new()和operator delete()函数分配和回收内存。allocate()函数有可能会抛出bad_alloc类型的异常。标准配置器是可以优化的,但new()函数和delete()函数被调用的确切时机很难预测。内存配置器包含一个较特殊的模板结构定义rebind。这种模板结构内存使配置器可间接为其他型别分配空间。例如,
如果需要实例一个容器,必须为“非元素型别”的对象分配空间,此时rebind模板结构可以派上大用场。通常,需要使用配置为数组分配空间,元素型别为指针。
函数allocate(num)操作可以为n个对象分配空间,该空间可以由对应的函数deallo- cate(p,n)释放。deallocate()函数以元素的个数num作为参数,在维持最少量的有关被分配存储的信息条件下,尽可能地优化配置器。同时,内存配置器可以要求程序员在调用deallocate()时能提供正确的num值。与运算符delete()不同的是,deallocate()函数的参数必须“非0”。
默认的配置使用operator new(size_t)获取内存,使用delete(void∗)操作释放内存。这意味着内存耗尽时,若调用new_handler(),会抛出std::bad_alloc的异常。
allocate()函数不需要每次都调用低级的分配系统,更好的做法是让配置器管理关于内存的自由表,以期在最小的时间开销下分配存储空间。allocate()的可选参数hint完全依赖于实现。尤其是在局部性特别重要的系统中,该函数为配置器提供分配内存的功能。
allocator<void>::pointer类型被作为通用指针类型,在标准容器中都使用void∗。用户在调用allocator()时,存在两种合理选择:(www.xing528.com)
1)没有提示。
2)用一个指针对象的指针作为提示,该对象经常与新对象一起使用。
之所以使用配置器,是为了在分配容器的内存时不必直接和原始存储打交道。
需要说明的是,allocator的操作均是基于pointer和reference两个类型定义表述的,这使用户可能提供其他替代类型来访问内存。在C++语言中,不可能定义出完美的引用类型,因为语言和库的实现需要使用大量的类型定义来支持那些常规的基本数据类型。
每个程序可以有一个配置器,用以提供对持续性存储器的访问。另外,配置器可以像“长”指针一样,访问超出常规指针的寻址范围的主存。
常规用户为配置器提供了一种不寻常的指针类型,用于服务特殊的用途,但对引用无法做与此等价的事情。配置器的设计很容易处理使用模板参数描述的类型对象。多数容器的实现需要其他类型的对象。rebind()类型可使一个配置器能分配任意类型的对象。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。