ff_malloc源码解读

ff_malloc.c

ff_malloc函数的代码写得还是有一些晦涩,读起来ff_malloc.c并不算很容易:

•数据结构链表的数据结构采用了union这种数据类型,主要目的是控制我们分配空间的内存对齐,代码在后面将union数据类型的大小作为分配空间的基本单位,每次分配的大小都是unoin大小的倍数。

union header {
  struct {
    union header *next;
    unsigned len;
  } meta;
  long x; /* Presence forces alignment of headers in memory. */
};

通过对union中的数据类型进行分析,一个struct是指针加unsigned的结构,为4+2=6字节大小,一个是long基本类型结构,为8字节大小,取其大者,一个union所占空间为8字节,接下来我们所分配的空间都是8的倍数。在数据含义上,下一个指向header的指针,指向了下一个空闲区块的header,无符号数len指出了本区块空间长度。•ff_malloc方法    ff_malloc方法采用最先适应的算法,从链表头位置去逐个向后遍历,如果找到了空间大于所需求空间的区块,则直接使用该区块进行内存分配,如果该区块大小大于了需求大小,应对区块进行切分后,再分配使用。•将需要的空间大小转换为最小分配单元(union的大小)的倍数。

unsigned true_size =
    (size + sizeof(union header) - 1) /
     sizeof(union header) + 1;

关于该分配大小的计算可以通过举出一些样例进行验证,分配8字节需要分配2个区块(一个header和一个8字节区块,分配9字节则需要分配3个区块(一个header和两个8字节区块)。•遍历空闲空间链表并进行操作

while (1) {
    /* part1:是否找到满足条件的区块 */
    if (p->meta.len >= true_size) {
        // 如果当前需求恰好为当前区块大小,直接分配
      if (p->meta.len == true_size) {
          // 在链表上,删除这个节点
        prev->meta.next = p->meta.next;
      } else {
          // 如果当前需求小于该区块大小,切割分配
          // 当前区块大小减去分配大小
        p->meta.len -= true_size;
          // 移动到当前区块的末尾创建一个新区块(见图示)
        p += p->meta.len;
          // 新区块的大小为分配大小
        p->meta.len = true_size;
      }
        // 下一次从prev处开始寻找
      first = prev;
        // 返回分配结果p+1(去掉了header)
      return (void *)(p+1);
        // 需要注意的是,新分配出的空间并不空闲,不会在链表上,需要调用free后才会空闲,然后连接到链表上
    }
    /* part2:是否不存在满足条件的区块*/
    // 不存在满足条件的区块通过p指针与first指针是否相等进行判断(循环链表的特性)
    if (p == first) {
      char *page;
      union header *block;
        // 一次分配较大的空间,避免多次无意义的分配,同时也为了形成连续地址
      if (true_size < NALLOC) {
        true_size = NALLOC;
      }
        // 调用sbrk函数修改数据段长度
      page = sbrk((intptr_t) (true_size * sizeof(union header)));
        // 分配失败的处理,当分配失败时,说明空间不足,分配失败,报错
      if (page == (char *)-1) {
        errno = ENOMEM;
        return NULL;
      }
      block = (union header *)page;
      block->meta.len = true_size;
      // 调用free把分配出的空间挂上空闲空间表,之后寻找会遍历到
      free((void *)(block + 1));
      p = first;
    }


    /* part3:移动指针,继续下一轮寻找*/
    prev = p;
    p = p->meta.next;
  }

•free方法   free方法所完成的事情是释放掉某一空间,然后将它挂到空闲空间表上。而且,在表上的空间地址应该是单调的。

void free(void* ptr) {
  // 防止对空指针操作
  if (ptr == NULL) {
    return;
  }
  // block指针指向当前区块的header,iter指针首先指向当前的链表首,之后将移动到插入位置
  union header *iter, *block;
  iter = first;
  block = (union header*)ptr - 1;


  // 将iter移动到插入位置,该插入位置使得block插入后队列依旧是单调队列
  while (block <= iter || block >= iter->meta.next) {
    if ((block > iter || block < iter->meta.next) &&
        iter >= iter->meta.next) {
      break;
    }
    iter = iter->meta.next;
  }
  
  // 如果插入后使得链表上的空间存在连续,那么直接合并区块,从而允许更大的分配需求
  // 前连续
  if (block + block->meta.len == iter->meta.next) {
      // 将后面的区块合并到前面的区块,前面的区块直接指向后面的后面的区块
    block->meta.len += iter->meta.next->meta.len;
    block->meta.next = iter->meta.next->meta.next;
  } else {
      // 不存在连续
    block->meta.next = iter->meta.next;
  }
  // 后连续 同理
  if (iter + iter->meta.len == block) {
    iter->meta.len += block->meta.len;
    iter->meta.next = block->meta.next;
  } else {
    iter->meta.next = block;
  }
  
  // 修改下次开始访问的位置,其实这个地方的修改我不是很理解,我个人认为不修改,也行
  first = iter;
}

•calloc方法

该方法的实现较为简单,就是通过调用ff_malloc分配所有空间 后,使用memset将分配到的空间置0。

•调用逻辑假设我们从最开始初始化,然后调用ff_malloc获得S个单位大小的空间,然后释放S空间,再申请大小为M的空间,假设M<S,再释放M空间,程序运行逻辑大致如图:

outside_default.png

运行测试发现bug(完成wf_malloc后)

设计探究内存分配差异

我为ff_malloc函数打印出寻找到可用分块时遍历的次数、可用分块的大小和自己需求大小

为wf_malloc函数打印出寻找到可用分块的大小、自己需求大小,令人比较震惊的是,ff_malloc函数所申请的空间严重超过了我们所需要的空间(超过50000个头长度),wf_malloc函数所申请的空间接近于我们所想要申请的空间(2048个头长度)。

ff_malloc的输出:

ff_malloc: alloc size 1024 at loop 1 size 1024

ff_malloc: alloc size 1024 at loop 1 size 1024

ff_malloc: alloc size 1024 at loop 1 size 1024

ff_malloc: alloc size 1024 at loop 1 size 1024

ff_malloc: alloc size 1024 at loop 1 size 1024

ff_malloc: alloc size 1024 at loop 1 size 1024

ff_malloc: alloc size 1024 at loop 1 size 1024

ff_malloc: alloc size 1024 at loop 1 size 1024

ff_malloc: alloc size 1024 at loop 1 size 1024

ff_malloc: alloc size 1024 at loop 1 size 1024

ff_malloc: alloc size 1024 at loop 1 size 1024

ff_malloc: alloc size 1024 at loop 1 size 1024

ff_malloc: alloc size 1024 at loop 1 size 1024

ff_malloc: alloc size 1024 at loop 1 size 1024

ff_malloc: alloc size 1024 at loop 1 size 1024

ff_malloc: alloc size 1024 at loop 1 size 1024

ff_malloc: alloc size 1024 at loop 1 size 1024

ff_malloc: alloc size 1024 at loop 1 size 1024

ff_malloc: alloc size 1024 at loop 1 size 1024

ff_malloc: alloc size 1024 at loop 1 size 1024

ff_malloc: alloc size 1024 at loop 1 size 1024

ff_malloc: alloc size 1024 at loop 1 size 1024

ff_malloc: alloc size 1024 at loop 1 size 1024

ff_malloc: alloc size 1024 at loop 1 size 1024

ff_malloc: alloc size 1024 at loop 1 size 1024

ff_malloc: alloc size 1024 at loop 1 size 1024

ff_malloc: alloc size 1024 at loop 1 size 1024

ff_malloc: alloc size 1024 at loop 1 size 1024

ff_malloc: alloc size 1024 at loop 1 size 1024

ff_malloc: alloc size 1024 at loop 1 size 1024

ff_malloc: alloc size 1024 at loop 1 size 1024

ff_malloc: alloc size 1024 at loop 1 size 1024

ff_malloc: alloc size 1024 at loop 1 size 1024

ff_malloc: alloc size 1024 at loop 1 size 1024

ff_malloc: alloc size 1024 at loop 1 size 1024

ff_malloc: alloc size 1024 at loop 1 size 1024

ff_malloc: alloc size 1024 at loop 1 size 1024

ff_malloc: alloc size 1024 at loop 1 size 1024

ff_malloc: alloc size 1024 at loop 1 size 1024

ff_malloc: alloc size 1024 at loop 1 size 1024

ff_malloc: alloc size 1024 at loop 1 size 1024

ff_malloc: alloc size 1024 at loop 1 size 1024

ff_malloc: alloc size 1024 at loop 1 size 1024

ff_malloc: alloc size 1024 at loop 1 size 1024

ff_malloc: alloc size 1024 at loop 1 size 1024

ff_malloc: alloc size 1024 at loop 1 size 1024

ff_malloc: alloc size 1024 at loop 1 size 1024

ff_malloc: alloc size 1024 at loop 1 size 1024

ff_malloc: alloc size 1024 at loop 1 size 1024

ff_malloc: alloc size 1024 at loop 1 size 1024

ff_malloc: alloc size 2 at loop 1 size 1024

ff_malloc: alloc size 2 at loop 0 size 1022

ff_malloc: alloc size 2 at loop 0 size 1020

ff_malloc: alloc size 2 at loop 0 size 1018

ff_malloc: alloc size 3 at loop 0 size 1016

ff_malloc: alloc size 3 at loop 0 size 1013

ff_malloc: alloc size 3 at loop 0 size 1010

ff_malloc: alloc size 3 at loop 0 size 1007

ff_malloc: alloc size 4 at loop 0 size 1004

ff_malloc: alloc size 4 at loop 0 size 1000

ff_malloc: alloc size 4 at loop 0 size 996

ff_malloc: alloc size 4 at loop 0 size 992

ff_malloc: alloc size 5 at loop 0 size 988

ff_malloc: alloc size 5 at loop 0 size 983

ff_malloc: alloc size 5 at loop 0 size 978

ff_malloc: alloc size 5 at loop 0 size 973

ff_malloc: alloc size 6 at loop 0 size 968

ff_malloc: alloc size 6 at loop 0 size 962

ff_malloc: alloc size 6 at loop 0 size 956

ff_malloc: alloc size 6 at loop 0 size 950

ff_malloc: alloc size 7 at loop 0 size 944

ff_malloc: alloc size 7 at loop 0 size 937

ff_malloc: alloc size 7 at loop 0 size 930

ff_malloc: alloc size 7 at loop 0 size 923

ff_malloc: alloc size 8 at loop 0 size 916

ff_malloc: alloc size 8 at loop 0 size 908

ff_malloc: alloc size 8 at loop 0 size 900

ff_malloc: alloc size 8 at loop 0 size 892

ff_malloc: alloc size 9 at loop 0 size 884

ff_malloc: alloc size 9 at loop 0 size 875

ff_malloc: alloc size 9 at loop 0 size 866

ff_malloc: alloc size 9 at loop 0 size 857

ff_malloc: alloc size 10 at loop 0 size 848

ff_malloc: alloc size 10 at loop 0 size 838

ff_malloc: alloc size 10 at loop 0 size 828

ff_malloc: alloc size 10 at loop 0 size 818

ff_malloc: alloc size 11 at loop 0 size 808

ff_malloc: alloc size 11 at loop 0 size 797

ff_malloc: alloc size 11 at loop 0 size 786

ff_malloc: alloc size 11 at loop 0 size 775

ff_malloc: alloc size 12 at loop 0 size 764

ff_malloc: alloc size 12 at loop 0 size 752

ff_malloc: alloc size 12 at loop 0 size 740

ff_malloc: alloc size 12 at loop 0 size 728

ff_malloc: alloc size 13 at loop 0 size 716

ff_malloc: alloc size 13 at loop 0 size 703

ff_malloc: alloc size 13 at loop 0 size 690

ff_malloc: alloc size 13 at loop 0 size 677

ff_malloc: alloc size 14 at loop 0 size 664

ff_malloc: alloc size 14 at loop 0 size 650

ff_malloc: alloc size 2 at loop 0 size 50176

ff_malloc: alloc size 2 at loop 0 size 50174

ff_malloc: alloc size 2 at loop 0 size 50172

ff_malloc: alloc size 2 at loop 0 size 50170

ff_malloc: alloc size 3 at loop 0 size 50168

ff_malloc: alloc size 3 at loop 0 size 50165

ff_malloc: alloc size 3 at loop 0 size 50162

ff_malloc: alloc size 3 at loop 0 size 50159

ff_malloc: alloc size 4 at loop 0 size 50156

ff_malloc: alloc size 4 at loop 0 size 50152

ff_malloc: alloc size 4 at loop 0 size 50148

ff_malloc: alloc size 4 at loop 0 size 50144

ff_malloc: alloc size 5 at loop 0 size 50140

ff_malloc: alloc size 5 at loop 0 size 50135

ff_malloc: alloc size 5 at loop 0 size 50130

ff_malloc: alloc size 5 at loop 0 size 50125

ff_malloc: alloc size 6 at loop 0 size 50120

ff_malloc: alloc size 6 at loop 0 size 50114

ff_malloc: alloc size 6 at loop 0 size 50108

ff_malloc: alloc size 6 at loop 0 size 50102

ff_malloc: alloc size 7 at loop 0 size 50096

ff_malloc: alloc size 7 at loop 0 size 50089

ff_malloc: alloc size 7 at loop 0 size 50082

ff_malloc: alloc size 7 at loop 0 size 50075

ff_malloc: alloc size 8 at loop 0 size 50068

ff_malloc: alloc size 8 at loop 0 size 50060

ff_malloc: alloc size 8 at loop 0 size 50052

ff_malloc: alloc size 8 at loop 0 size 50044

ff_malloc: alloc size 9 at loop 0 size 50036

ff_malloc: alloc size 9 at loop 0 size 50027

ff_malloc: alloc size 9 at loop 0 size 50018

ff_malloc: alloc size 9 at loop 0 size 50009

ff_malloc: alloc size 10 at loop 0 size 50000

ff_malloc: alloc size 10 at loop 0 size 49990

ff_malloc: alloc size 10 at loop 0 size 49980

ff_malloc: alloc size 10 at loop 0 size 49970

ff_malloc: alloc size 11 at loop 0 size 49960

ff_malloc: alloc size 11 at loop 0 size 49949

ff_malloc: alloc size 11 at loop 0 size 49938

ff_malloc: alloc size 11 at loop 0 size 49927

ff_malloc: alloc size 12 at loop 0 size 49916

ff_malloc: alloc size 12 at loop 0 size 49904

ff_malloc: alloc size 12 at loop 0 size 49892

ff_malloc: alloc size 12 at loop 0 size 49880

ff_malloc: alloc size 13 at loop 0 size 49868

ff_malloc: alloc size 13 at loop 0 size 49855

ff_malloc: alloc size 13 at loop 0 size 49842

ff_malloc: alloc size 13 at loop 0 size 49829

ff_malloc: alloc size 14 at loop 0 size 49816

ff_malloc: alloc size 14 at loop 0 size 49802

向下滑动查看所有内容

wf_malloc的输出:

no found and alloc size 1024

no found and alloc size 1024

wf_malloc: alloc size 1024 at block size 2048

wf_malloc: alloc size 2 at block size 1024

wf_malloc: alloc size 2 at block size 1022

wf_malloc: alloc size 2 at block size 1020

wf_malloc: alloc size 3 at block size 1018

wf_malloc: alloc size 3 at block size 1015

wf_malloc: alloc size 3 at block size 1012

wf_malloc: alloc size 3 at block size 1009

wf_malloc: alloc size 4 at block size 1006

wf_malloc: alloc size 4 at block size 1002

wf_malloc: alloc size 4 at block size 998

wf_malloc: alloc size 4 at block size 994

wf_malloc: alloc size 5 at block size 990

wf_malloc: alloc size 5 at block size 985

wf_malloc: alloc size 5 at block size 980

wf_malloc: alloc size 5 at block size 975

wf_malloc: alloc size 6 at block size 970

wf_malloc: alloc size 6 at block size 964

wf_malloc: alloc size 6 at block size 958

wf_malloc: alloc size 6 at block size 952

wf_malloc: alloc size 7 at block size 946

wf_malloc: alloc size 7 at block size 939

wf_malloc: alloc size 7 at block size 932

wf_malloc: alloc size 7 at block size 925

wf_malloc: alloc size 8 at block size 918

wf_malloc: alloc size 8 at block size 910

wf_malloc: alloc size 8 at block size 902

wf_malloc: alloc size 8 at block size 894

wf_malloc: alloc size 9 at block size 886

wf_malloc: alloc size 9 at block size 877

wf_malloc: alloc size 9 at block size 868

wf_malloc: alloc size 9 at block size 859

wf_malloc: alloc size 10 at block size 850

wf_malloc: alloc size 10 at block size 840

wf_malloc: alloc size 10 at block size 830

wf_malloc: alloc size 10 at block size 820

wf_malloc: alloc size 11 at block size 810

wf_malloc: alloc size 11 at block size 799

wf_malloc: alloc size 11 at block size 788

wf_malloc: alloc size 11 at block size 777

wf_malloc: alloc size 12 at block size 766

wf_malloc: alloc size 12 at block size 754

wf_malloc: alloc size 12 at block size 742

wf_malloc: alloc size 12 at block size 730

wf_malloc: alloc size 13 at block size 718

wf_malloc: alloc size 13 at block size 705

wf_malloc: alloc size 13 at block size 692

wf_malloc: alloc size 13 at block size 679

wf_malloc: alloc size 14 at block size 666

wf_malloc: alloc size 14 at block size 652

wf_malloc: alloc size 2 at block size 2048

wf_malloc: alloc size 2 at block size 2046

wf_malloc: alloc size 2 at block size 2044

wf_malloc: alloc size 2 at block size 2042

wf_malloc: alloc size 3 at block size 2040

wf_malloc: alloc size 3 at block size 2037

wf_malloc: alloc size 3 at block size 2034

wf_malloc: alloc size 3 at block size 2031

wf_malloc: alloc size 4 at block size 2028

wf_malloc: alloc size 4 at block size 2024

wf_malloc: alloc size 4 at block size 2020

wf_malloc: alloc size 4 at block size 2016

wf_malloc: alloc size 5 at block size 2012

wf_malloc: alloc size 5 at block size 2007

wf_malloc: alloc size 5 at block size 2002

wf_malloc: alloc size 5 at block size 1997

wf_malloc: alloc size 6 at block size 1992

wf_malloc: alloc size 6 at block size 1986

wf_malloc: alloc size 6 at block size 1980

wf_malloc: alloc size 6 at block size 1974

wf_malloc: alloc size 7 at block size 1968

wf_malloc: alloc size 7 at block size 1961

wf_malloc: alloc size 7 at block size 1954

wf_malloc: alloc size 7 at block size 1947

wf_malloc: alloc size 8 at block size 1940

wf_malloc: alloc size 8 at block size 1932

wf_malloc: alloc size 8 at block size 1924

wf_malloc: alloc size 8 at block size 1916

wf_malloc: alloc size 9 at block size 1908

wf_malloc: alloc size 9 at block size 1899

wf_malloc: alloc size 9 at block size 1890

wf_malloc: alloc size 9 at block size 1881

wf_malloc: alloc size 10 at block size 1872

wf_malloc: alloc size 10 at block size 1862

wf_malloc: alloc size 10 at block size 1852

wf_malloc: alloc size 10 at block size 1842

wf_malloc: alloc size 11 at block size 1832

wf_malloc: alloc size 11 at block size 1821

wf_malloc: alloc size 11 at block size 1810

wf_malloc: alloc size 11 at block size 1799

wf_malloc: alloc size 12 at block size 1788

wf_malloc: alloc size 12 at block size 1776

wf_malloc: alloc size 12 at block size 1764

wf_malloc: alloc size 12 at block size 1752

wf_malloc: alloc size 13 at block size 1740

wf_malloc: alloc size 13 at block size 1727

wf_malloc: alloc size 13 at block size 1714

wf_malloc: alloc size 13 at block size 1701

wf_malloc: alloc size 14 at block size 1688

wf_malloc: alloc size 14 at block size 1674

wf_malloc: alloc size 2 at block size 2048

wf_malloc: alloc size 2 at block size 2046

wf_malloc: alloc size 2 at block size 2044

wf_malloc: alloc size 2 at block size 2042

wf_malloc: alloc size 3 at block size 2040

wf_malloc: alloc size 3 at block size 2037

wf_malloc: alloc size 3 at block size 2034

wf_malloc: alloc size 3 at block size 2031

wf_malloc: alloc size 4 at block size 2028

wf_malloc: alloc size 4 at block size 2024

wf_malloc: alloc size 4 at block size 2020

wf_malloc: alloc size 4 at block size 2016

wf_malloc: alloc size 5 at block size 2012

wf_malloc: alloc size 5 at block size 2007

wf_malloc: alloc size 5 at block size 2002

wf_malloc: alloc size 5 at block size 1997

wf_malloc: alloc size 6 at block size 1992

wf_malloc: alloc size 6 at block size 1986

wf_malloc: alloc size 6 at block size 1980

wf_malloc: alloc size 6 at block size 1974

wf_malloc: alloc size 7 at block size 1968

wf_malloc: alloc size 7 at block size 1961

wf_malloc: alloc size 7 at block size 1954

wf_malloc: alloc size 7 at block size 1947

wf_malloc: alloc size 8 at block size 1940

wf_malloc: alloc size 8 at block size 1932

wf_malloc: alloc size 8 at block size 1924

wf_malloc: alloc size 8 at block size 1916

wf_malloc: alloc size 9 at block size 1908

wf_malloc: alloc size 9 at block size 1899

wf_malloc: alloc size 9 at block size 1890

wf_malloc: alloc size 9 at block size 1881

wf_malloc: alloc size 10 at block size 1872

wf_malloc: alloc size 10 at block size 1862

wf_malloc: alloc size 10 at block size 1852

wf_malloc: alloc size 10 at block size 1842

wf_malloc: alloc size 11 at block size 1832

wf_malloc: alloc size 11 at block size 1821

wf_malloc: alloc size 11 at block size 1810

wf_malloc: alloc size 11 at block size 1799

wf_malloc: alloc size 12 at block size 1788

wf_malloc: alloc size 12 at block size 1776

wf_malloc: alloc size 12 at block size 1764

wf_malloc: alloc size 12 at block size 1752

wf_malloc: alloc size 13 at block size 1740

wf_malloc: alloc size 13 at block size 1727

wf_malloc: alloc size 13 at block size 1714

wf_malloc: alloc size 13 at block size 1701

wf_malloc: alloc size 14 at block size 1688

wf_malloc: alloc size 14 at block size 1674

向下滑动查看所有内容

思考一下到底出了什么问题,我觉得这已经不是效率的问题,而是代码存在bug,通过仔细分析,我发现bug在于ff_malloc函数中,若没有发现,然后再去申请,会修改true_size,在下一轮循环的时候,并没有修改回来。这是一个很严重的错误。

于是我们着手修复这个bug。在进入到true_size < NALLOC判断前保存true_size并在退出时恢复。

// 备份
      int bk_true_size = true_size;
      if (true_size < NALLOC) {
        true_size = NALLOC;
      }
      page = sbrk((intptr_t) (true_size * sizeof(union header)));
      if (page == (char *)-1) {
        /* There was no memory left to allocate. */
        errno = ENOMEM;
        return NULL;
      }
      /* Create a fragment from this new memory and add it to the list
       * so the above logic can handle breaking it if necessary. */
      block = (union header *)page;
      block->meta.len = true_size;
      free((void *)(block + 1));
      p = first;
      //恢复
      true_size = bk_true_size;

然后重新编译运行:

ff_malloc: alloc size 2 at loop 1 size 1024

ff_malloc: alloc size 2 at loop 0 size 1022

ff_malloc: alloc size 2 at loop 0 size 1020

ff_malloc: alloc size 2 at loop 0 size 1018

ff_malloc: alloc size 3 at loop 0 size 1016

ff_malloc: alloc size 3 at loop 0 size 1013

ff_malloc: alloc size 3 at loop 0 size 1010

ff_malloc: alloc size 3 at loop 0 size 1007

ff_malloc: alloc size 4 at loop 0 size 1004

ff_malloc: alloc size 4 at loop 0 size 1000

ff_malloc: alloc size 4 at loop 0 size 996

ff_malloc: alloc size 4 at loop 0 size 992

ff_malloc: alloc size 5 at loop 0 size 988

ff_malloc: alloc size 5 at loop 0 size 983

ff_malloc: alloc size 5 at loop 0 size 978

ff_malloc: alloc size 5 at loop 0 size 973

ff_malloc: alloc size 6 at loop 0 size 968

ff_malloc: alloc size 6 at loop 0 size 962

ff_malloc: alloc size 6 at loop 0 size 956

ff_malloc: alloc size 6 at loop 0 size 950

ff_malloc: alloc size 7 at loop 0 size 944

ff_malloc: alloc size 7 at loop 0 size 937

ff_malloc: alloc size 7 at loop 0 size 930

ff_malloc: alloc size 7 at loop 0 size 923

ff_malloc: alloc size 8 at loop 0 size 916

ff_malloc: alloc size 8 at loop 0 size 908

ff_malloc: alloc size 8 at loop 0 size 900

ff_malloc: alloc size 8 at loop 0 size 892

ff_malloc: alloc size 9 at loop 0 size 884

ff_malloc: alloc size 9 at loop 0 size 875

ff_malloc: alloc size 9 at loop 0 size 866

ff_malloc: alloc size 9 at loop 0 size 857

ff_malloc: alloc size 10 at loop 0 size 848

ff_malloc: alloc size 10 at loop 0 size 838

ff_malloc: alloc size 10 at loop 0 size 828

ff_malloc: alloc size 10 at loop 0 size 818

ff_malloc: alloc size 11 at loop 0 size 808

ff_malloc: alloc size 11 at loop 0 size 797

ff_malloc: alloc size 11 at loop 0 size 786

ff_malloc: alloc size 11 at loop 0 size 775

ff_malloc: alloc size 12 at loop 0 size 764

ff_malloc: alloc size 12 at loop 0 size 752

ff_malloc: alloc size 12 at loop 0 size 740

ff_malloc: alloc size 12 at loop 0 size 728

ff_malloc: alloc size 13 at loop 0 size 716

ff_malloc: alloc size 13 at loop 0 size 703

ff_malloc: alloc size 13 at loop 0 size 690

ff_malloc: alloc size 13 at loop 0 size 677

ff_malloc: alloc size 14 at loop 0 size 664

ff_malloc: alloc size 14 at loop 0 size 650

ff_malloc: alloc size 2 at loop 1 size 1024

ff_malloc: alloc size 2 at loop 0 size 1022

ff_malloc: alloc size 2 at loop 0 size 1020

ff_malloc: alloc size 2 at loop 0 size 1018

ff_malloc: alloc size 3 at loop 0 size 1016

ff_malloc: alloc size 3 at loop 0 size 1013

ff_malloc: alloc size 3 at loop 0 size 1010

ff_malloc: alloc size 3 at loop 0 size 1007

ff_malloc: alloc size 4 at loop 0 size 1004

ff_malloc: alloc size 4 at loop 0 size 1000

ff_malloc: alloc size 4 at loop 0 size 996

ff_malloc: alloc size 4 at loop 0 size 992

ff_malloc: alloc size 5 at loop 0 size 988

ff_malloc: alloc size 5 at loop 0 size 983

ff_malloc: alloc size 5 at loop 0 size 978

ff_malloc: alloc size 5 at loop 0 size 973

ff_malloc: alloc size 6 at loop 0 size 968

ff_malloc: alloc size 6 at loop 0 size 962

ff_malloc: alloc size 6 at loop 0 size 956

ff_malloc: alloc size 6 at loop 0 size 950

ff_malloc: alloc size 7 at loop 0 size 944

ff_malloc: alloc size 7 at loop 0 size 937

ff_malloc: alloc size 7 at loop 0 size 930

ff_malloc: alloc size 7 at loop 0 size 923

ff_malloc: alloc size 8 at loop 0 size 916

ff_malloc: alloc size 8 at loop 0 size 908

ff_malloc: alloc size 8 at loop 0 size 900

ff_malloc: alloc size 8 at loop 0 size 892

ff_malloc: alloc size 9 at loop 0 size 884

ff_malloc: alloc size 9 at loop 0 size 875

ff_malloc: alloc size 9 at loop 0 size 866

ff_malloc: alloc size 9 at loop 0 size 857

ff_malloc: alloc size 10 at loop 0 size 848

ff_malloc: alloc size 10 at loop 0 size 838

ff_malloc: alloc size 10 at loop 0 size 828

ff_malloc: alloc size 10 at loop 0 size 818

ff_malloc: alloc size 11 at loop 0 size 808

ff_malloc: alloc size 11 at loop 0 size 797

ff_malloc: alloc size 11 at loop 0 size 786

ff_malloc: alloc size 11 at loop 0 size 775

ff_malloc: alloc size 12 at loop 0 size 764

ff_malloc: alloc size 12 at loop 0 size 752

ff_malloc: alloc size 12 at loop 0 size 740

ff_malloc: alloc size 12 at loop 0 size 728

ff_malloc: alloc size 13 at loop 0 size 716

ff_malloc: alloc size 13 at loop 0 size 703

ff_malloc: alloc size 13 at loop 0 size 690

ff_malloc: alloc size 13 at loop 0 size 677

ff_malloc: alloc size 14 at loop 0 size 664

ff_malloc: alloc size 14 at loop 0 size 650

ff_malloc: alloc size 2 at loop 1 size 1024

ff_malloc: alloc size 2 at loop 0 size 1022

ff_malloc: alloc size 2 at loop 0 size 1020

ff_malloc: alloc size 2 at loop 0 size 1018

ff_malloc: alloc size 3 at loop 0 size 1016

ff_malloc: alloc size 3 at loop 0 size 1013

ff_malloc: alloc size 3 at loop 0 size 1010

ff_malloc: alloc size 3 at loop 0 size 1007

ff_malloc: alloc size 4 at loop 0 size 1004

ff_malloc: alloc size 4 at loop 0 size 1000

ff_malloc: alloc size 4 at loop 0 size 996

ff_malloc: alloc size 4 at loop 0 size 992

ff_malloc: alloc size 5 at loop 0 size 988

ff_malloc: alloc size 5 at loop 0 size 983

ff_malloc: alloc size 5 at loop 0 size 978

ff_malloc: alloc size 5 at loop 0 size 973

ff_malloc: alloc size 6 at loop 0 size 968

ff_malloc: alloc size 6 at loop 0 size 962

ff_malloc: alloc size 6 at loop 0 size 956

ff_malloc: alloc size 6 at loop 0 size 950

ff_malloc: alloc size 7 at loop 0 size 944

ff_malloc: alloc size 7 at loop 0 size 937

ff_malloc: alloc size 7 at loop 0 size 930

ff_malloc: alloc size 7 at loop 0 size 923

ff_malloc: alloc size 8 at loop 0 size 916

ff_malloc: alloc size 8 at loop 0 size 908

ff_malloc: alloc size 8 at loop 0 size 900

ff_malloc: alloc size 8 at loop 0 size 892

ff_malloc: alloc size 9 at loop 0 size 884

ff_malloc: alloc size 9 at loop 0 size 875

ff_malloc: alloc size 9 at loop 0 size 866

ff_malloc: alloc size 9 at loop 0 size 857

ff_malloc: alloc size 10 at loop 0 size 848

ff_malloc: alloc size 10 at loop 0 size 838

ff_malloc: alloc size 10 at loop 0 size 828

ff_malloc: alloc size 10 at loop 0 size 818

ff_malloc: alloc size 11 at loop 0 size 808

ff_malloc: alloc size 11 at loop 0 size 797

ff_malloc: alloc size 11 at loop 0 size 786

ff_malloc: alloc size 11 at loop 0 size 775

ff_malloc: alloc size 12 at loop 0 size 764

ff_malloc: alloc size 12 at loop 0 size 752

ff_malloc: alloc size 12 at loop 0 size 740

ff_malloc: alloc size 12 at loop 0 size 728

ff_malloc: alloc size 13 at loop 0 size 716

ff_malloc: alloc size 13 at loop 0 size 703

ff_malloc: alloc size 13 at loop 0 size 690

ff_malloc: alloc size 13 at loop 0 size 677

ff_malloc: alloc size 14 at loop 0 size 664

ff_malloc: alloc size 14 at loop 0 size 650

向下滑动查看所有内容

发现ff_malloc函数获得了正确的结果。

大家在做实验的时候,可以注意一下这个bug,否则会造成极大的内存碎片。

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐