(STL标准模板库)4.分配器概述、使用

目录

分配器概述

分配器的使用

函数


分配器概述

内存分配器扮演内存池的角色,通过大量减少对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()也是分配器中的重要函数,用来释放内存,需要记住分配的对象数量以释放正确大小的内存



}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值