C++ Allocator使用方法

一般情况下,内存分配和对象构造组合一起可能会导致不必要的浪费,比如:

string* const p = new string[n];//构造n个空string
string s;
string *q = p;
while(cin >> s && q != p+n)
	*q++ =s;//赋予*q一个新值
const size_t size = q-p;//记住我们读取了多少个string
delete [] p;

new表达式分配并初始化了n个string.但是,我们可能不需要n个string,少量string可能就足够了。这样,我们就可能创建了一些永远也用不到的对象。而且,对于那些确实要使用的对象,我们也在初始化之后立即赋予了它们新值,每个使用到的元素都被赋值了两次:第一次是在默认初始化时,随后是赋值时候.
更重要的是,那些没有默认构造函数的类就不能动态分配数组了

Allocator表现出一种特殊内存模型,可以让你把对内存的需求转变成对内存的直接调用

标准库allocator类定义在头文件xmemory0中,它帮助我们将内存分配和对象构造分离开来。它是一个模板,定义一个allocator对象,我们必须指明这个allocator可以分配的对象类型。当一个allocator对象分配内存时,它会根据给定的对象类型来确定恰当的内存大小和对齐位置。

allocator<string>alloc;//可以分配string的allocator对象
auto const p = alloc.allocate(n);//分配n个未初始化的string

allocate

a.allocate(num) 

效果:为num个元素分配内存

constrtuct

a.construct(p,val)

效果:将P所指的元素初始化为val

destroy

a.destroy(p)

效果:销毁P所指的元素

deallocate

a.deallocate(p,num)

效果:回收p所指的"可容纳num个元素"的内存空间


allocator分配未构造的内存

allocator分配的内存是未构造的,我们按需要在此内存中构造对象.

auto q = p;
alloc.construct(q++);// *q为空字符串
alloc.construct(q++,10,'c');//*q为cccccccccc
alloc.construct(q++,"hi");//*q为hi

当我们用完对象后,必须对每个构造的元素调用destroy来销毁它们

while(q != p)
{
	alloc.destroy(--q);
}

一旦元素被销毁后,我们就可以重新使用这部分内存来保存其他string,也可以将其归还给系统,释放内存通过调用deallocate来完成:

alloc.deallocate(p,n);


拷贝和填充未初始化内存的算法

标准库还未allocator类定义了两个伴随算法,可以在未初始化内存中创建对象
C++ Allocator使用方法_第1张图片

auto p = alloc.allocate(vi.size() * 2);
auto q = uninitialized_copy(vi.begin(), vi.end(), p);//通过拷贝vi中的元素来构造从p开始的元素
uninitialized_fill_n(q, vi.size(),42);//将剩余元素初始化为42

你可能感兴趣的:(C++,C++,Allocator,分配器)