??????malloc??????????????????c?????????????????????????????????malloc????????????????????????????????????????????????
1?????????malloc?????????????????????
??????malloc????????????Linux man?????????????????????????????????
????????????????????????window???????????????
extern void *malloc(unsigned int num_bytes);
????????????
#include<malloc.h>??????#include<alloc.h>?????????????????????????????????
??????????????????????????????????????????????????????????????????
??????????????????NULL
???????????????????????????????????????????????????free()??????????????????????????????
?????????void*,?????????????????????????????????c,c++??????void*???????????????????????????????????????????????????void?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
malloc:
malloc?????????????????????????????????????????????????????????
malloc??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????malloc??????????????????????????????????????????????????????malloc??????????????????????????????malloc??????????????????????????????????????????????????????NP-hard??????????????????????????????malloc????????????????????????????????????????????????????????????realloc???free???
malloc???free????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
2???malloc???new
new???????????????????????????????????????????????????????????????????????????
int *p;p = new int;//???????????????int* ?????????????????????sizeof(int)p = new int[100];//???????????????int*???????????????????????????sizeof(int)*100
???malloc?????????????????????????????????????????????????????????????????????????????????????????????
int *p;p = (int *)malloc(sizeof(int));
???1???malloc????????????void*,????????????????????????p=malloc(sizeof(int));????????????????????????void????????????int*?????????????????? ???2???malloc????????????sizeof(int)?????????????????????????????????????????????????????????????????????p=(int*)malloc(1),???????????????????????????????????????????????????????????????????????? ???3???malloc????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????NULL????????????????????????memset?????????
???????????????
malloc??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????malloc???????????????size??????????????????????????????malloc???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
??????????????????malloc???????????????????????????
?????????????????????????????????????????????
???????????????????????????????????????
???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????2N????????????????????????N???????????????????????????64???CPU???64??????????????????????????????????????????????????????264Byte???
??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????MMU??????????????????
??????????????????
?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????Linux?????????????????????????????????4096 Byte
??????????????????????????????????????????????????????????????????64????????????4G???????????????4K???????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????????4k?????????????????????????????????12????????????????????????????????????????????? MMU???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????TLB???????????????????????????????????????????????????????????????????????????
?????????????????????
?????????????????????????????????????????????????????????MMU???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????malloc??????????????????????????????????????? ???????????????????????????
Linux?????????????????????
2.2.1????????????
??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
???Linux 64??????????????????????????????64bit?????????????????????0x0000000000000000-0xFFFFFFFFFFFFFFF????????????????????????????????????Linux????????????????????????????????????
???????????????????????????
?????????????????????????????????User Space??????User Space?????????????????????????????????????????????????????????
Code??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? Data???????????????????????????????????????????????? BSS???????????????????????????????????????????????? Heap????????????????????????????????????????????????????????????????????????????????????????????????
Mapping Area:????????????mmap????????????????????????????????????????????????malloc?????????????????????mmap?????????????????????????????????????????????????????????????????????????????????????????????????????????
Stack:??????????????????????????????????????????
Heap???????????????
???????????????malloc???????????????????????????Heap????????????????????????Heap????????????????????????
Linux????????????break?????????????????????????????????????????????????????????????????????break?????????????????????????????????????????????????????????????????????break?????????????????????????????????????????????????????????????????????????????????
brk???sbrk
?????????????????????????????????????????????????????????????????????????????????break???????????????????????????Linux??????brk???sbrk??????????????????break?????????????????????????????????????????????
int brk(void *addr);void *sbrk(inptr_t increment);
brk???break???????????????????????????????????????sbrk???break?????????????????????increment?????????????????????brk????????????????????????0???????????????-1????????????errno???ENOMEM,sbrk???????????????break????????????????????????????????????????????????void*???-1; ???????????????rlimirt
??????????????????????????????????????????????????????????????????????????????????????????????????????????????????rlimit??????????????????????????????????????????????????????????????????getrlimit????????????????????????????????????????????????????????????????????????rlimit
??????rlimt??????????????????
struct rlimit{ rlimt_t rlim_cur; rlim_t rlim_max;};
?????????????????????????????????????????????????????????setrlimit???rlimit???????????????????????????????????????????????????????????????????????????????????????????????????????????????
??????malloc
(1)????????????
???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????meta????????????????????????meta??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????malloc???????????????
???????????????????????????????????????block
typedef struct s_block *t_block;struck s_block{ size_t size;//??????????????? t_block next;//???????????????????????? int free;//?????????????????? int padding;//??????4???????????????meta????????????8????????? char data[1];//?????????????????????????????????????????????????????????????????????????????????meta};
???2??????????????????block
?????????????????????block?????????????????????block??????????????????????????????????????? First fit:?????????????????????????????????????????????????????????size?????????????????????????????? Best fit:????????????????????????????????????????????????????????????size????????????????????????????????????????????? ???????????????????????????best fit??????????????????????????????payload???????????????first fit????????????????????????????????????????????????first fit??????
t_block find_block(t_block *last,size_t size){ t_block b = first_block; while(b&&b->size>=size) { *last = b; b = b->next; } return b;}
find_block???first_block???????????????????????????????????????block?????????block???????????????????????????????????????NULL???????????????????????????????????????last???????????????????????????????????????????????????block.????????????????????????????????????block????????????block????????????
???3???????????????block ????????????block???????????????size??????????????????????????????????????????????????????block?????????????????????????????????sbrk????????????struct???
#define BLOCK_SIZE 24t_block extend_heap{ t_block b; b = sbrk(0); if(sbrk(BLOCK_SIZE+s)==(void*)-1) return NULL; b->size = s; b->next - NULL; if(last) last->next = b; b->free = 0; return b;};
???4?????????block First fit????????????????????????????????????????????????????????????size?????????????????????block????????????????????????payload,???????????????????????????????????????????????????????????????????????????block
void split_block(t_block b,size_t s){ t_block new; new = b->data; new->size = b->size-s-BLOCK_SIZE; new->next = b->next; new ->free = 1; b->size = s; b->next = new;}
???5???malloc????????? ????????????????????????????????????????????????????????????malloc.??????????????????????????????block????????????first_block,????????????NULL?????????????????????????????????????????????BLOCK_SIZE+8????????????????????? ??????????????????malloc????????????????????????8?????????????????????size??????8??????????????????????????????size???????????????size????????????8?????????
size_t align8(size_t s){ if(s&0x7 == 0) return s; return ((s>>3)+1)<<3;}
#define BLOCK_SIZE 24void *first_block=NULL;void *mallloc(size_t size){ t_block b,last; size_t s; //???????????? s = align8(size); if(first_block) //????????????block last = first_block; b = find_block(&last,s); if(b) { //????????????????????? if((b->size-s)>=(BLOCK_SIZE + 8)) split_block(b,s); b->free = 0; } else { //???????????????block????????????????????? b=extend_heap(last,s); if(!b) { return NULL; } else { b=extend_heap(NULL,s); if(!b) { return NULL; } first_block = b; } } return b->data;}
???????????????????????????????????????????????????????????????????????????????????????????????????????????????
????????????: c?????? malloc????????????
????????????: http://www.xuebuyuan.com/ruanjian/c/290079.html
以上就上有关c??????malloc????????????的相关介绍,要了解更多c??????,malloc??????,c,malloc??????内容请登录学步园。