我看到了源,但仍然无法完全自信地解释差异:
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_string
s是参考计数。这意味着多个地方可以zend_string
简单地通过增加其引用计数来使用相同的地方。这可以使用zend_string_copy
或来完成zend_string_addref
。
该zend_string_release
函数是您在大多数情况下要使用的函数,它将减少引用计数。如果碰巧您是该字符串的最后一个用户(即refcount现在为零),则该字符串将被释放。
该zend_string_free
函数是针对您已经知道自己是唯一使用该字符串的情况的一种优化。它会直接释放字符串,而无需先检查refcount(断言仅用于调试,在发行版本中不存在)。
如有疑问,请使用zend_string_release
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句