zend_mm_add_to_free_list
2015-09-13 23:55:04 2 举报
`zend_mm_add_to_free_list`是Zend引擎中的一个函数,用于将一个已分配的内存块添加到空闲列表中。这个函数的主要作用是在不再需要某个内存块时,将其归还给Zend的内存管理器,以便在其他需要内存的地方重用。通过这种方式,Zend引擎可以有效地管理内存资源,避免内存泄漏和浪费。 在实际应用中,程序员通常不需要直接调用`zend_mm_add_to_free_list`函数,因为PHP的内存管理是由Zend引擎自动完成的。但是,了解这个函数有助于理解PHP的内存管理机制,以及如何编写高性能的PHP代码。
作者其他创作
大纲/内容
if (ZEND_MM_FREE_BLOCK_SIZE(prev) != size)当前节点block的大小是否“正好”等于size?通过prev-info._size来判断
为NULL
完成任务
是large block
空的
p = &heap-large_free_buckets[index];获取large_free_buckets数组中第index个指针本身的地址
如果这个孩子不为NULL,将它作为新的prev进入下一循环直到我们找到新blk在large_free_buckets[index]中所属的位置为止
不等于size
p = &prev-child[(m (ZEND_MM_NUM_BUCKETS-1)) & 1];因为新blk的size不等于当前prev指向的block的size那么我们要在prev的两个孩子里面选择下面该往哪走这取决于目前size的剩余的最高位是1还是0是0就往左孩子child[2]走,是1就往右孩子child[1]走
zend_mm_free_block *next = prev-next_free_block;prev-next_free_block = next-prev_free_block = mm_block;mm_block-next_free_block = next;mm_block-prev_free_block = prev; mm_block-parent = NULL;将当前prev指向的block的next指向新的block并做好相关设置
那我们就直接将新blk作为这个孩子*p = mm_block;mm_block-parent = p;mm_block-prev_free_block = mm_block-next_free_block = mm_block;
正好等于size
for (m = size (ZEND_MM_NUM_BUCKETS - index); ; m = 1) 先将size左移直到将最高位挤出,然后每次loop都将目前最高位挤出
有blk
k
if (!*p)p的内容是否为NULL?也就是large_free_buckets[index]指向的链表是否还没有block?
size = ZEND_MM_FREE_BLOCK_SIZE(mm_block);获取传入的block-info._size,这个值在block被传进来之前应该被set好,否则在这个函数里面我们无从得知它的大小,也不应该在这个函数中得知
if (!*p)看看我们选择的孩子是否为NULL?
zend_mm_free_block *prev = *p;prev指向目前large_free_buckets[index]的表头
index = ZEND_MM_LARGE_BUCKET_INDEX(size);如果是个large block它在large_free_buckets[]里面的index应该是它size的最高位1的位数比如size=20(10100)的index为4,即其最高位1的位置从右数第5个,位数为4
if (EXPECTED(!ZEND_MM_SMALL_SIZE(size)))它的size是否是一个large block?
mm_block-child[0] = mm_block-child[1] = NULL;
0 条评论
回复 删除
下一页