php扩展开发笔记(6)ZVAL_STRING 和 ZVAL_STRINGL
字符串处理是我们常用的操作,而 zend 封装了很多关于字符串操作相关的宏,先看下 ZVAL_STRING 和 ZVAL_STRINGL
<code><span>#define ZVAL_STRING(z, s, duplicate) do { \</span><span>const</span><span>char</span> *__s=(s); \ zval *__z = (z); \ Z_STRLEN_P(__z) = <span>strlen</span>(__s); \ Z_STRVAL_P(__z) = (duplicate?estrndup(__s, Z_STRLEN_P(__z)):(<span>char</span>*)__s);\ Z_TYPE_P(__z) = IS_STRING; \ } <span>while</span> (<span>0</span>) <span>#define ZVAL_STRINGL(z, s, l, duplicate) do { \</span><span>const</span><span>char</span> *__s=(s); <span>int</span> __l=l; \ zval *__z = (z); \ Z_STRLEN_P(__z) = __l; \ Z_STRVAL_P(__z) = (duplicate?estrndup(__s, __l):(<span>char</span>*)__s);\ Z_TYPE_P(__z) = IS_STRING; \ } <span>while</span> (<span>0</span>)</code>
因为 php 内部很多字符串操作(例如 substr)最后都是给予这样的宏来操作的,所以在这里了解这两个宏非常重要。
ZVAL_STRINGL 在处理的时候,因为给了 length 参数,所以不需要在使用 strlen 来求字符串的长度了, 性能上有所提升。
前面在常用的 zend api 里面应该说过了,关于 estrndup 也都是封装了一层的,在 php 扩展开发的时候,尽量使用系统封装的函数,这样可以优化内存,降低内存泄漏等风险,有几个 e* 开发的函数,可以看之前的相关文章。
estrndup 定义
<code><span>#define estrndup(s, length) _estrndup((s), (length) ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC)</span></code>
_estrndup 定义
<code> ZEND_API <span>char</span> *_estrndup(<span>const</span><span>char</span> *s, uint length ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC) { <span>char</span> *p; <span>#ifdef ZEND_SIGNALS</span> TSRMLS_FETCH(); <span>#endif</span> HANDLE_BLOCK_INTERRUPTIONS(); p = (<span>char</span> *) _emalloc(length+<span>1</span> ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC); <span>if</span> (UNEXPECTED(p == NULL)) { HANDLE_UNBLOCK_INTERRUPTIONS(); <span>return</span> p; } <span>memcpy</span>(p, s, length); p[length] = <span>0</span>; HANDLE_UNBLOCK_INTERRUPTIONS(); <span>return</span> p; }</code>
可以自行搜索关于 _emalloc 等相关函数定义。
以上就介绍了php扩展开发笔记(6)ZVAL_STRING 和 ZVAL_STRINGL,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

使用Java的String.valueOf()函数将基本数据类型转换为字符串在Java开发中,当我们需要将基本数据类型转换为字符串时,一种常见的方法是使用String类的valueOf()函数。这个函数可以接受基本数据类型的参数,并返回对应的字符串表示。在本文中,我们将探讨如何使用String.valueOf()函数进行基本数据类型转换,并提供一些代码示例来

char数组转string的方法:可以通过赋值来实现,使用{char a[]=" abc d\0efg ";string s=a;}语法,让char数组对string直接赋值,执行代码即可完成转换。

使用Java的String.replace()函数替换字符串中的字符(串)在Java中,字符串是不可变的对象,这意味着一旦创建了一个字符串对象,就无法修改它的值。但是,你可能会遇到需要替换字符串中的某些字符或者字符串的情况。这时候,我们可以使用Java的String类中的replace()方法来实现字符串的替换。String类的replace()方法有两种重

大家好,今天给大家分享java基础知识之String。String类的重要性就不必说了,可以说是我们后端开发用的最多的类,所以,很有必要好好来聊聊它。

在Golang编程中,byte、rune和string类型是非常基础、常见的数据类型。它们在处理字符串、文件流等数据操作时发挥着重要作用。而在进行这些数据操作时,我们通常需要对它们进行相互的转换,这就需要掌握一些转换技巧。本文将介绍Golang函数的byte、rune和string类型转换技巧,旨在帮助读者更好地理解这些数据类型,并能够熟练地在编程实践中应用

使用Java的String.length()函数获取字符串的长度在Java编程中,字符串是一种非常常见的数据类型,我们经常需要获取字符串的长度,即字符串中字符的个数。在Java中,我们可以使用String类的length()函数来获取字符串的长度。下面是一个简单的示例代码:publicclassStringLengthExample{publ

一、认识String1.JDK中的String首先我们看看JDK中的String类源码,它实现了很多接口,可以看到String类被final修饰了,这就说明String类不可以被继承,String不存在子类,这样所有使用JDK的人,用到的String类都是同一个,如果String允许被继承,每个人都可以对String进行扩展,每个人使用的String都不是同一个版本,两个不同的人使用相同的方法,表现出不同的结果,这就导致代码没办法进行开发了继承和方法覆写在带来灵活性的同时,也会带来很多子类行为不

PHP实现框架:ZendFramework入门教程ZendFramework是PHP开发的一种开源网站框架,目前由ZendTechnologies维护,ZendFramework采用了MVC设计模式,提供了一系列可重用的代码库,服务于实现Web2.0应用程序和Web服务。ZendFramework深受PHP开发者的欢迎和推崇,拥有广泛
