php扩展开发笔记(6)ZVAL_STRING 和 ZVAL_STRINGL
来源:互联网 发布:同济大学复试测绘编程 编辑:程序博客网 时间:2024/06/01 08:50
字符串处理是我们常用的操作,而 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 来求字符串的长度了, 性能上有所提升。
前面在常用的 zend api 里面应该说过了,关于 estrndup 也都是封装了一层的,在 php 扩展开发的时候,尽量使用系统封装的函数,这样可以优化内存,降低内存泄漏等风险,有几个 e* 开发的函数,可以看之前的相关文章。
estrndup 定义
#define estrndup(s, length) _estrndup((s), (length) ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC)
_estrndup 定义
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; }
可以自行搜索关于 _emalloc 等相关函数定义。
0 0
- php扩展开发笔记(6)ZVAL_STRING 和 ZVAL_STRINGL
- ZVAL_STRING 和 ZVAL_STRINGL
- php扩展开发笔记(8)继承和实现接口
- PHP扩展开发笔记
- PHP 扩展开发笔记一
- php扩展开发笔记(2)多个源码文件的配置和编译
- php扩展开发笔记(5)一些数组操作相关的宏和简单示例
- php扩展开发笔记(9)sizeof 和 strlen 遇到空字符 '\0' 的问题
- php扩展开发1(apache和php源码编译)
- PHP扩展开发(6):接收参数
- PHP扩展开发(6):接收参数
- PHP扩展开发(6):接收参数
- Windows 下开发PHP 扩展笔记
- php扩展开发(一 基本介绍和扩展开发的基本步骤)
- VC 6 开发PHP扩展
- php扩展开发(2)
- php扩展开发(3)
- php 扩展开发(一)
- 用service命令和chkconfig命令管理服务进程
- 表单提交 enctype="multipart/form-data"的时候 request.getparameter取值为空的问题
- 利用Associative机制为UIAlertView添加一个Block属性,将AlertView与button的响应事件关联
- 忍——屁话
- hdu 2569 整理下水题 递推动规
- php扩展开发笔记(6)ZVAL_STRING 和 ZVAL_STRINGL
- Could not resolve placeholder 参考
- uvalive 4356 火势控制系统
- 【麦可网】Cocos2d-X跨平台游戏开发学习笔记---第三课:认识Cocos2D-X引擎
- hdu 2084 整理下水题 递推动规
- response重定向和request转发的去呗
- 文件下载
- 15周《C++语言基础》程序阅读——二进制文件及文件的随机读写(1)
- 【hdoj 1242】Rescue