|
假如你确实想实现一个永久性分配,那么这个参数应该被设置为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 下一页 |
评论加载中…