加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

zend_string_release和zend_string_free有什么区别?

发布时间:2020-12-13 21:52:50 所属栏目:PHP教程 来源:网络整理
导读:我看到了 source,但仍无法用完全自信的方式解释差异: static zend_always_inline void zend_string_free(zend_string *s){ if (!IS_INTERNED(s)) { ZEND_ASSERT(GC_REFCOUNT(s) = 1); pefree(s,GC_FLAGS(s) IS_STR_PERSISTENT); }}static zend_always_inlin
我看到了 source,但仍无法用完全自信的方式解释差异:

static zend_always_inline void zend_string_free(zend_string *s)
{
    if (!IS_INTERNED(s)) {
        ZEND_ASSERT(GC_REFCOUNT(s) <= 1);
        pefree(s,GC_FLAGS(s) & IS_STR_PERSISTENT);
    }
}

static zend_always_inline void zend_string_release(zend_string *s)
{
    if (!IS_INTERNED(s)) {
        if (--GC_REFCOUNT(s) == 0) {
            pefree(s,GC_FLAGS(s) & IS_STR_PERSISTENT);
        }
    }
}

编辑:

很高兴有一个实际的例子,其中zend_string_free比zend_string_release更合适,反之亦然.

解决方法

zend_strings是引用计数.这意味着多个地方只需通过递增其引用计数即可使用相同的zend_string.这是使用zend_string_copy或zend_string_addref完成的.

zend_string_release函数是您希望在绝大多数情况下使用的函数,它将减少引用计数.如果碰巧你是字符串的最后一个用户(即refcount现在为零),那么字符串将被释放.

zend_string_free函数是对已经知道您是唯一使用该字符串的情况的优化.它将直接释放字符串,而不首先检查引用计数(断言仅用于调试,它在发布版本中不存在).

如有疑问,请使用zend_string_release.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读