关闭

ZVAL_STRING 和 ZVAL_STRINGL

标签: PHP扩展
218人阅读 评论(0) 收藏 举报
分类:

字符串处理是我们常用的操作,而 zend 封装了很多关于字符串操作相关的宏,先看下 ZVAL_STRING 和 ZVAL_STRINGL

#define ZVAL_STRING(z, s, duplicate) do {	\
		const char *__s=(s);				\
		zval *__z = (z);					\
		Z_STRLEN_P(__z) = strlen(__s);		\
		Z_STRVAL_P(__z) = (duplicate?estrndup(__s, Z_STRLEN_P(__z)):(char*)__s);\
		Z_TYPE_P(__z) = IS_STRING;			\
	} while (0)

#define ZVAL_STRINGL(z, s, l, duplicate) do {	\
		const char *__s=(s); int __l=l;			\
		zval *__z = (z);						\
		Z_STRLEN_P(__z) = __l;					\
		Z_STRVAL_P(__z) = (duplicate?estrndup(__s, __l):(char*)__s);\
		Z_TYPE_P(__z) = IS_STRING;				\
	} while (0)

因为 php 内部很多字符串操作(例如 substr)最后都是给予这样的宏来操作的,所以在这里了解这两个宏非常重要。

ZVAL_STRINGL 在处理的时候,因为给了 length 参数,所以不需要在使用 strlen 来求字符串的长度了, 性能上有所提升。

关于 estrndup 也都是封装了一层的,在 php 扩展开发的时候,尽量使用系统封装的函数,这样可以优化内存,降低内存泄漏等风险

ZEND_API char *_estrndup(const char *s, uint length ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
{
	char *p;
#ifdef ZEND_SIGNALS
	TSRMLS_FETCH();
#endif

	HANDLE_BLOCK_INTERRUPTIONS();

	p = (char *) _emalloc(length+1 ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
	if (UNEXPECTED(p == NULL)) {
		HANDLE_UNBLOCK_INTERRUPTIONS();
		return p;
	}
	memcpy(p, s, length);
	p[length] = 0;
	HANDLE_UNBLOCK_INTERRUPTIONS();
	return p;
}

有几个 e* 开发的函数 具体参看




0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:14316次
    • 积分:379
    • 等级:
    • 排名:千里之外
    • 原创:23篇
    • 转载:10篇
    • 译文:0篇
    • 评论:1条
    联系笔者
    联系我
    推荐一个PHP开发者聚集地
    最新评论