我正在开发一个 PHP 扩展,其中一个对象方法需要返回一个数组zval
。
该方法如下所示:
ZEND_METHOD(myObject, myMethod)
{
zval **myArrayProperty;
if (zend_hash_find(Z_OBJPROP_P(getThis()), "myArrayProperty", sizeof("myArrayProperty"), (void **) &myArrayProperty) == FAILURE) {
RETURN_FALSE;
}
RETURN_ZVAL(*myArrayProperty, 1, 0);
}
该代码工作正常,并做了预期的事情 - 它返回对象的myArrayProperty
. 但是,我想优化这个过程。
myArrayProperty
存储一个数组,这个数组可能很大。并且RETURN_ZVAL()
宏复制该数组以返回值。复制过程需要大量时间来获取内存并复制所有数组值。同时,返回的数组通常用于只读操作。所以一个很好的优化是使用 PHP 的引用计数机制并且不重复myArrayProperty
内容。相反,我会增加refcount
并myArrayProperty
返回指向它的指针。在 PHP 扩展中使用变量时,这与通常使用的策略相同。
但是,似乎没有办法做到这一点 - 您必须复制值才能从 PHP 扩展函数返回它。将函数签名更改为通过引用返回值不是一种选择,因为它将属性和返回值联系起来 - 即稍后更改返回值,也会更改属性。这不是可接受的行为。
无法使用引用计数看起来很奇怪,因为 PHP 中的代码相同:
function myMethod() {
{
return $this->myArrayProperty;
}
通过引用计数机制进行了优化。这就是我在 StackOverflow 上问这个问题的原因,以防我错过了什么。
那么,有没有办法从 PHP 扩展中的函数返回一个数组,而无需将数组复制到内存中?