在PHP
中,释放zend_string
可以使用zend_string_release
或者zend_string_release_ex
。那什么时候应该用zend_string_release
,什么时候应该用zend_string_release_ex
呢?一句话总结就是,如果我们不确定这个zend_string
是不是persistent
方式分配的内存,那么就用zend_string_release
,如果我们确定这个zend_string
是不是以persistent
方式分配的内存,那么就使用zend_string_release_ex
,因为zend_string_release_ex
可以稍微提升性能。我们来看一下这两个函数。
首先是zend_string_release
:
1 |
|
这个函数做的事情比较简单,先对zend_string
的引用计数减一,如果引用计数变为了0
,那么就会真正的去调用pefree
释放内存。除此之外,这里还需要判断zend_string
的分配方式,如果是persistent
方式分配的,那么调用free
,否则调用efree
。
我们再来看看zend_string_release_ex
:
1 | static zend_always_inline void zend_string_release_ex(zend_string *s, int persistent) |
他做的事情也比较简单,先对zend_string
的引用计数减一,如果引用计数变为了0
,那么判断persistent
再决定调用哪一个free
。乍眼一看,似乎zend_string_release_ex
做的事情比zend_string_release
还多,多了一个断言,为啥性能就会更好呢?因为这个ZEND_ASSERT
在PHP
的非debug
模式下,是不会执行的。并且,如果对persistent
进行硬编码,编译器会对zend_string_release_ex
进行优化:
1 | if (persistent) { |
也就是说,在编译的时候,就已经知道要走哪一个分支了。