厦 门 代 孕 价 格 一 般 多 少

厦门代孕需要一般多少【联系V/信:138-0226-9370】代孕包成功,代孕包男孩,供卵代孕,三代试管婴儿选性别,供卵试管婴儿,十年老品牌代孕公司

想要理解一样事物,就要先用自己的语言去描述一件事物。在我查阅资料后,发现malloc函数简单说来就是空闲内存空间收集器,并把空闲空间关联起来,用术语来说就是:将空闲内存块合并起来并称为"闲置链表"。然后在这块空闲空间进行划分,划出用户需要的与用户不需要的。然后把用户需要的给用户,不需要的返还给"闲置链表"。而用户使用free释放时候也是扔回去的过程。但是这时候的空闲空间是间断的片段,malloc函数就需要去整理整合这些片段,若空间达不到用户需要,malloc就会返还NULL指针,告诉用户空间不足。这就是为什么malloc需要检验返还值了。

那么new和malloc的工作机制到底有什么不同呢= =?通过查找,我翻到了new的源码

复制代码
 1 void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)  
 2         {       // 尝试申请内存空间  
 3         void *p;  //这个指针用于指向获取到的空间,且返回该指针给调用方,且设置为void*是为了能够指向任意格式
 4         while ((p = malloc(size)) == 0)  //利用malloc函数调用来申请内存空间,得到一个闲置链表
 5                 if (_callnewh(size) == 0)  
 6                 {       // 抛出没内存的信息  
 7                         _THROW_NCEE(_XSTD bad_alloc, );
 8                 }  
 9   
10         return (p);  
11         } 
复制代码

我们可以看到new的实现方法也是通过malloc函数来实现的,但是它们之间有很多不同之处。通过对malloc的源码进行查看

复制代码
void *malloc (unsigned int size)  
{  
    char *caddr;  //虽然unsigned char* caddr是编译器认可的最小内存申明,但这里我们使用 char *
  
    if (!malloc_ptr)  
        return NULL;  
    if ((malloc_ptr + size + sizeof(int)) > malloc_top) {  
        prom_printf("malloc failed\n");  
        return NULL;  
    }  
    *(int *)malloc_ptr = size;  
    caddr = malloc_ptr + sizeof(int);  
    malloc_ptr += size + sizeof(int);  
    last_alloc = caddr;  
    malloc_ptr = (char *) ((((unsigned int) malloc_ptr) + 3) & (~3));  
    return caddr;  
} 
复制代码

可以粗略的看出,malloc函数是不会去计算用户所需要的内存空间,需要用户自己去计算自己需要的空间大小,例如在数组中,malloc是需要用户自己给出计算后的大小,而new会额外储存数组大小,不需要用户再次进行计算。(参数表中的size_t,通常我们用sizeof(XXX)操作,这个操作所得到的结果就是size_t类型)。

也就是说,new 基于 malloc,却又高于malloc,是它的一个提升版本。

在返回值上面,new和malloc函数的区别只是在于,new是抛错,要判断是否分配成功应该用异常捕获的机制,而malloc函数在内存不够时直接返还NULL。

由于个人能力有限,只能进行浅层次的对比。

 

想要理解一样事物,就要先用自己的语言去描述一件事物。在我查阅资料后,发现malloc函数简单说来就是空闲内存空间收集器,并把空闲空间关联起来,用术语来说就是:将空闲内存块合并起来并称为"闲置链表"。然后在这块空闲空间进行划分,划出用户需要的与用户不需要的。然后把用户需要的给用户,不需要的返还给"闲置链表"。而用户使用free释放时候也是扔回去的过程。但是这时候的空闲空间是间断的片段,malloc函数就需要去整理整合这些片段,若空间达不到用户需要,malloc就会返还NULL指针,告诉用户空间不足。这就是为什么malloc需要检验返还值了。

那么new和malloc的工作机制到底有什么不同呢= =?通过查找,我翻到了new的源码

复制代码
 1 void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)  
 2         {       // 尝试申请内存空间  
 3         void *p;  //这个指针用于指向获取到的空间,且返回该指针给调用方,且设置为void*是为了能够指向任意格式
 4         while ((p = malloc(size)) == 0)  //利用malloc函数调用来申请内存空间,得到一个闲置链表
 5                 if (_callnewh(size) == 0)  
 6                 {       // 抛出没内存的信息  
 7                         _THROW_NCEE(_XSTD bad_alloc, );
 8                 }  
 9   
10         return (p);  
11         } 
复制代码

我们可以看到new的实现方法也是通过malloc函数来实现的,但是它们之间有很多不同之处。通过对malloc的源码进行查看

复制代码
void *malloc (unsigned int size)  
{  
    char *caddr;  //虽然unsigned char* caddr是编译器认可的最小内存申明,但这里我们使用 char *
  
    if (!malloc_ptr)  
        return NULL;  
    if ((malloc_ptr + size + sizeof(int)) > malloc_top) {  
        prom_printf("malloc failed\n");  
        return NULL;  
    }  
    *(int *)malloc_ptr = size;  
    caddr = malloc_ptr + sizeof(int);  
    malloc_ptr += size + sizeof(int);  
    last_alloc = caddr;  
    malloc_ptr = (char *) ((((unsigned int) malloc_ptr) + 3) & (~3));  
    return caddr;  
} 
复制代码

可以粗略的看出,malloc函数是不会去计算用户所需要的内存空间,需要用户自己去计算自己需要的空间大小,例如在数组中,malloc是需要用户自己给出计算后的大小,而new会额外储存数组大小,不需要用户再次进行计算。(参数表中的size_t,通常我们用sizeof(XXX)操作,这个操作所得到的结果就是size_t类型)。

也就是说,new 基于 malloc,却又高于malloc,是它的一个提升版本。

在返回值上面,new和malloc函数的区别只是在于,new是抛错,要判断是否分配成功应该用异常捕获的机制,而malloc函数在内存不够时直接返还NULL。

由于个人能力有限,只能进行浅层次的对比。

猜你喜欢

转载自www.cnblogs.com/yhhs/p/9914223.html