php从内存中取数组,如何从PHP扩展返回数组,而不将其复制到内存中?

我正在开发一个

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内容.相反,我会增加myArrayProperty的引用计数,只返回指向它的指针.当使用PHP扩展中的变量时,这与通常使用的策略相同.

但是,似乎没有办法 – 你必须复制值才能从PHP扩展函数返回它.更改函数签名以通过引用返回值不是一个选项,因为它链接属性和返回值 – 即稍后更改返回值,也会更改属性.这不是一种可接受的行为.

无法参与引用计数看起来很奇怪,因为PHP中的代码相同:

function myMethod() {

{

return $this->myArrayProperty;

}

通过引用计数机制进行优化.这就是我在StackOverflow上提出这个问题的原因,以防我错过了什么.

那么,有没有办法从PHP扩展中的函数返回一个数组,而不是在内存中复制数组?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值