1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
// stl_alloc.h __default_alloc_template
template <bool threads, int inst>
class __default_alloc_template
{
private:
static const int _ALIGN = 8; // 调整到 8字节
static const int _MAX_BYTES = 128; // 最大字节数
static const int _NFREELISTS = 16; // free lists 数目 _MAX_BYTES/_ALIGN
static size_t _S_round_up(size_t __bytes){// 调整到 8字节
return (((__bytes) + (size_t) _ALIGN-1) & ~((size_t) _ALIGN - 1));
}
union _Obj{
union _Obj* _M_free_list_link;
char _M_client_data[1];
};//感觉定义一个结构体, 元素只有一个 指向 自己的 地址也可以
// 静态变量
static _Obj* volatile _S_free_list[];
// 确定应在哪个 list
static size_t _S_freelist_index(size_t __bytes){
return (((__bytes) + (size_t)_ALIGN-1)/(size_t)_ALIGN - 1);
}
static void* _S_refill(size_t __n);
static char* _S_chunk_alloc(size_t __size, int &__nobjs);
// Chunk allocation state, chunk_alloc 里使用
static char* _S_start_free; // 内存池起始地址
static char* _S_end_free; // 内存池结束地址
static size_t _S_heap_size; // 内存池大小
public:
//-------接口----------
static void *allocate(size_t __n){
void *__ret = 0;
if (__n > (size_t) _MAX_BYTES){
__ret = malloc_alloc::allocate(__n);
}
else{
//volatile 告诉编译器 不进行优化
_Obj* volatile* __my_free_list = _S_free_list + _S_freelist_index(__n);
_Obj* __result = *__my_free_list;
if (__result == 0)
__ret = _S_refill(_S_round_up(__n)); //重填链表
else{
//和链表一样, 指向下一个结点
*__my_free_list = __result -> _M_free_list_link;
__ret = __result;
}
}
return __ret;
};
static void deallocate(void* __p, size_t __n){
// 小于128的存储块, 要将他返回到那个链表中
if (__n > (size_t) _MAX_BYTES)
malloc_alloc::deallocate(__p, __n);
else
{
_Obj* volatile* __my_free_list = _S_free_list + _S_freelist_index(__n);
_Obj* __q = (_Obj*)__p;
__q -> _M_free_list_link = *__my_free_list;
*__my_free_list = __q;
}
}
static void* reallocate(void* __p, size_t __old_sz, size_t __new_sz){
void *__result;
size_t __copy_sz;
if (__old_sz > (size_t) _MAX_BYTES && __new_sz > (size_t) _MAX_BYTES){
//原来的大小比128大
return(realloc(__p, __new_sz));
}
if (_S_round_up(__old_sz) == _S_round_up(__new_sz)) return(__p);
__result = allocate(__new_sz);
__copy_sz = __new_sz > __old_sz? __old_sz : __new_sz;
memcpy(__result, __p, __copy_sz);
deallocate(__p, __old_sz);
return(__result);
}
};
template <bool __threads, int __inst>
char* __default_alloc_template<__threads, __inst>::_S_start_free = 0;
template <bool __threads, int __inst>
char* __default_alloc_template<__threads, __inst>::_S_end_free = 0;
template <bool __threads, int __inst>
size_t __default_alloc_template<__threads, __inst>::_S_heap_size = 0;
template <bool __threads, int __inst>
typename __default_alloc_template<__threads, __inst>::_Obj* volatile
__default_alloc_template<__threads, __inst> ::_S_free_list[
__default_alloc_template<__threads, __inst>::_NFREELISTS
] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|