2006-10-26

深入探讨PHP中的内存管理问题

来源: 天极网 作者:佚名 评论 0 条
 

  假如你确实想实现一个永久性分配,那么这个参数应该被设置为1;在这种情况下,请求是通过传统型malloc()分配器家族进行传递的。然而,假如运行时刻逻辑认为这个块不需要永久性分配;那么,这个参数可以被设置为零,并且调用将会被调整到针对每种请求的内存分配器函数。

  例如,pemalloc(buffer_len,1)将映射到malloc(buffer_len),而pemalloc(buffer_len,0)将被使用下列语句映射到emalloc(buffer_len):

#define in Zend/zend_alloc.h:
#define pemalloc(size, persistent) ((persistent)?malloc(size): emalloc(size))

  所有这些在ZendMM中提供的分配器函数都能够从下表中找到其更传统的对应实现。

  表格1展示了ZendMM支持下的每一个分配器函数以及它们的e/pe对应实现:

  表格1.传统型相对于PHP特定的分配器。

分配器函数e/pe对应实现
void *malloc(size_t count);void *emalloc(size_t count);void *pemalloc(size_t count,char persistent);
void *calloc(size_t count); void *ecalloc(size_t count);void *pecalloc(size_t count,char persistent);
void *realloc(void *ptr,size_t count); void *erealloc(void *ptr,size_t count);
void *perealloc(void *ptr,size_t count,char persistent);
void *strdup(void *ptr); void *estrdup(void *ptr);void *pestrdup(void *ptr,char persistent);
void free(void *ptr);void efree(void *ptr);
void pefree(void *ptr,char persistent);

  你可能会注重到,即使是pefree()函数也要求使用永久性标志。这是因为在调用pefree()时,它实际上并不知道是否ptr是一种永久性分配。针对一个非永久性分配调用free()能够导致双倍的空间释放,而针对一种永久性分配调用efree()有可能会导致一个段错误,因为内存治理器会试图查找并不存在的治理信息。因此,你的代码需要记住它分配的数据结构是否是永久性的。

  除了分配器函数核心部分外,还存在其它一些非常方便的ZendMM特定的函数,例如:

void *estrndup(void *ptr,int len);

  该函数能够分配len 1个字节的内存并且从ptr处复制len个字节到最新分配的块。这个estrndup()函数的行为可以大致描述如下:

void *estrndup(void *ptr, int len)
{
 char *dst = emalloc(len 1);
 memcpy(dst, ptr, len);
 dst[len] = 0;
 return dst;
}

共3页: 上一页 [1] [2] 3 下一页
(本文仅表明作者个人观点,不代表本站及其管理员立场.) 推荐 收藏 投稿 打印 返回 关闭
上一篇:10个重要的PHP网络信息函数说明  
下一篇:PHP语言发展历史
    评论加载中…
 推荐文章
     

网站首页  -  网站地图 -   站长论坛  -  网站投稿  -    -  网站管理
Copyright © 2008 芜湖站长站 All Rights Reserved 皖ICP备07500611号