目录
分配器概述
内存分配器扮演内存池的角色,通过大量减少对malloc()的调用,来节省内存,甚至还有一定的分配效率的提高
void test1()
{
std::list<int> mylist;//双向链表,内存不要求挨着
mylist.push_back(10);
mylist.push_back(20);
mylist.push_back(30);
for (auto iter = mylist.begin(); iter != mylist.end(); ++iter)
{
std::cout << *iter << std::endl;
int* p = &(*iter);
printf("%p\n", p);
}
}
测试结果可以得知分配器没有采用内存池
void a_test2()
{
//调试使用
std::list<int> mylist;//双向链表,内存不要求挨着
mylist.push_back(10);
mylist.push_back(20);
mylist.push_back(30);
auto iter = mylist.begin();
for (int i = 0; i < 2; i++)
iter++;
int* p = &(*iter);
mylist.pop_back();
}
如果采用内存池原理,周围不可能被删除这么多内容,基本可以断定其没有采用内存池的工作原理。
经过测试,allocator这个C++标准库提供的缺省的内存分配器没有采用内存池的工作原理,可能直接调用了malloc()。
分配器的使用
allocator分配器是个类模板。一般写代码很少用,但语法上,它也是能够直接使用的。
函数
allocate()是分配器中的重要函数,用来分配一段原始的未构造的内存
这段内存能保存n个类型为m的对象(12字节)
std::allocator<m> alloc; int* p = alloc.allocate(n);
deallocate()也是分配器中的重要函数,用来释放内存,需要记住分配的对象数量以释放正确大小的内存
void b_test()
{
std::allocator<int> alloc;//定义一个alloc对象,为类型为int的对象分配内存
int* p = alloc.allocate(3);
//allocate()是分配器中的重要函数,用来分配一段原始的未构造的内存
//这段内存能保存3个类型为int的对象(12字节)
int* q = p;
*q = 1; q++;
*q = 2; q++;
*q = 3; q++;
alloc.deallocate(p, 3);
//deallocate()也是分配器中的重要函数,用来释放内存,需要记住分配的对象数量以释放正确大小的内存
}