现在的位置: 首页 > 编程语言 > 正文

c??????malloc????????????

2020年02月13日 编程语言 ⁄ 共 11557字 ⁄ 字号 评论关闭

??????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??????内容请登录学步园。

抱歉!评论已关闭.