オブジェクトメソッドが配列を返す必要がある 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()
マクロは値を返すためにその配列を複製します。複製プロセスでは、メモリを取得してすべての配列値をコピーするのにかなりの時間がかかります。同時に、返された配列は通常、読み取り専用操作に使用されます。myArrayProperty
したがって、適切な最適化は、参照カウントで PHP のメカニズムを使用し、コンテンツを複製しないことです。むしろ、私はそれを増やしrefcount
て、myArrayProperty
それへのポインタを返すだけです。これは、PHP 拡張機能で変数を操作するときに通常使用されるのと同じ戦術です。
ただし、それを行う方法はないようです-PHP拡張関数から値を返すには、値を複製する必要があります。関数シグネチャを参照によって戻り値に変更することはオプションではありません。これは、プロパティと戻り値をリンクするためです。つまり、後で戻り値を変更すると、プロパティも変更されます。それは容認できる行為ではありません。
PHP の同じコード:
function myMethod() {
{
return $this->myArrayProperty;
}
参照カウントメカニズムによって最適化されます。そのため、何かを見逃した場合に備えて、StackOverflow でこの質問をしています。
では、配列をメモリにコピーせずに、PHP 拡張機能の関数から配列を返す方法はありますか?