openEuler实验:ff_malloc源码解读及勘误
ff_malloc源码解读ff_malloc.cff_malloc函数的代码写得还是有一些晦涩,读起来ff_malloc.c并不算很容易:•数据结构链表的数据结构采用了union这种数据类型,主要目的是控制我们分配空间的内存对齐,代码在后面将union数据类型的大小作为分配空间的基本单位,每次分配的大小都是unoin大小的倍数。union header {struct {union...
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空间,程序运行逻辑大致如图:

运行测试发现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,否则会造成极大的内存碎片。
鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐


所有评论(0)