SGI STL 的 一,二级配置器浅析

补充知识: 由于小型区块可能会造成内存破损,所以SGI设计了双层配置器,第一级配置器直接使用malloc()和free(),第二级配置器则根据配置区块的大小采用不同策略(若区块大小大于128bytes就调用一级配置器,若小于128bytes就调用二级配置器(内存池处理))SGI STL 的第一级配置器 和 第二级配置器的关系 <一> 第一级配置器的工作机制: allocate()和real
摘要由CSDN通过智能技术生成

补充知识:
由于小型区块可能会造成内存破损,所以SGI设计了双层配置器,第一级配置器直接使用malloc()和free(),第二级配置器则根据配置区块的大小采用不同策略(若区块大小大于128bytes就调用一级配置器,若小于128bytes就调用二级配置器(内存池处理))

SGI STL 的第一级配置器 和 第二级配置器的关系
这里写图片描述

<一> 第一级配置器的工作机制:

allocate()和reallocate()函数在调用malloc()和realloc()失败后,调用oom_malloc()和oom_realloc(),oom_malloc()和oom_realloc()函数内都有内循环,不断的调用“内存不足处理例程”,期望在某次调用后可以获得足够的内存;但若内存不足处理例程客端没有设定,oom_malloc()和oom_realloc()会直接调用__THROW_BAD_ALLOC抛出bad_alloc异常信息,或者利用exit(1)直接终止程序。

第一级配置器的代码如下:

#if 1
#include <iostream>
#include <malloc.h>
#include <stdlib.h>

using namespace std;
#define __THROW_BAD_ALLOC cerr<<"out of memory."<<endl; exit(1);
#elif !defined(__THROW_BAD_ALLOC)
#include <iostream.h>
#define __THROW_BAD_ALLOC cerr<<"out of memory."<<endl; exit(1);
#endif

template<int inst>
class __malloc_alloc_template
{
private:
    static void *oom_malloc(size_t);
    static void *oom_realloc(void *, size_t);
    static void (*__malloc_alloc_oom_handler)();
public:
    static void *allocate(size_t n)
    {
        void *result = malloc(n);
        if(0 == result){
            result = oom_malloc(n);
        }
        return result;
    }
    static void *deallocate(void *p, size_t)
    {
        free(p);
    }
    static void *reallocate(void *p, size_t, size_t new_sz)
    {
        void *result = realloc(p, new_sz);
        if(0 == result){
            result = oom_realloc(p, new_sz);
        }
        return result;
    }

    static void (*set_malloc_handler(void (*f)()))()
    {
        void(*old)() = __malloc_alloc_oom_handler;
        __malloc_alloc_oom_handler = f;
        return old;
    }
};

template<int inst>
void(*__malloc_alloc_template<inst>::__malloc_alloc_oom_handler)() = 0;

template<int inst>
void *__malloc_alloc_template<inst>::oom_malloc(size_t n)
{
    void (*my_malloc_handler)();
    void *result;

    for(; ;){
        my_malloc_handler = __malloc_alloc_oom_handler;
        if(0 == my_malloc_handler){
            __THROW_BAD_ALLOC;
        }
        (*my_malloc_handler)();
        result = malloc(n);
        if(result){
            return result;
        }
    }
}

template<int inst>
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值