PHP内核代码中smart_str更高效的用法

发布: 2012-04-06 10:55

在PHP内核中,smart_str默认初始化大小为78,

每次分配多加128字节。

随着以后逐渐append操作执行,

smart_ptr不断检测是否内存已经用完,

如果已经用完则需要重新分配内存,

这样对于存储大字符串的时候,

smart_ptr需要多次检测并分配内存,效率就降低了。

先来看一下smart_str的结构:

typedef struct

{

char *c;

size_t len;

size_t a;

}smart_str;



其中c成员是字符红缓存,len表示当前已用长度,a表示总长度。

smart_str提供了一个重新分配内存的宏,smart_str_alloc(dest, nlen, what)

为了申请一块大内存,使用如下代码:

int newlen = 5000;

smart_str_alloc(buf, newlen, 0);

第一个代表已有smart_str结构实例指针,

what表示是否分配永久内存,一般用0,表示使用php已经申请使用的内存。

printf("clen=%d, tlen=%d\n", buf->len, buf->a);

可输出当前smart_str的使用情况。



更高效的使用方式来了,

eg1,

buf->c[buf->len++] = '*'; // 追加一个字符。



eg2,

strcpy(buf->c + buf->len, s);

buf->len += strlen(s); // 追加一个字符串

这样比使用smart_str_appendc宏更有效率。

不过这样的安全问题要注意,前提是已经为后续操作分配了内存的内存,不能内存溢出了。


原文: http://qtchina.tk/?q=node/646

Powered by zexport