ホームページ  >  記事  >  バックエンド開発  >  PHP 拡張機能開発ノート (6) ZVAL_STRING と ZVAL_STRINGL

PHP 拡張機能開発ノート (6) ZVAL_STRING と ZVAL_STRINGL

WBOY
WBOYオリジナル
2016-08-08 09:22:361695ブラウズ

文字列処理は私たちにとって一般的に使用される操作であり、zend は文字列操作に関連する多くのマクロをカプセル化します。まず、ZVAL_STRING と ZVAL_STRINGL を見てみましょう。なぜなら、PHP 内の多くの文字列操作 (substr など) は最終的に次のようになります。マクロは操作に使用されるため、ここでこれら 2 つのマクロを理解することが非常に重要です。

ZVAL_STRINGL 処理時に長さパラメータが与えられるため、文字列の長さを調べるために strlen を使用する必要がなくなり、パフォーマンスが向上します。

一般的に使用される Zend API については、以前にも触れたはずですが、PHP 拡張機能を開発する場合は、カプセル化されたシステム関数を使用するようにしてください。これにより、メモリが最適化され、メモリ リークなどのリスクが軽減されます。 e* が開発した関数については、過去の関連記事をご覧ください。

estrndup定義

<code><span>#define ZVAL_STRING(z, s, duplicate) do {   \</span><span>const</span><span>char</span> *__s=(s);                \
         zval *__z = (z);                    \
         Z_STRLEN_P(__z) = <span>strlen</span>(__s);      \
         Z_STRVAL_P(__z) = (duplicate?estrndup(__s, Z_STRLEN_P(__z)):(<span>char</span>*)__s);\
         Z_TYPE_P(__z) = IS_STRING;          \
     } <span>while</span> (<span>0</span>)

 <span>#define ZVAL_STRINGL(z, s, l, duplicate) do {   \</span><span>const</span><span>char</span> *__s=(s); <span>int</span> __l=l;         \
         zval *__z = (z);                        \
         Z_STRLEN_P(__z) = __l;                  \
         Z_STRVAL_P(__z) = (duplicate?estrndup(__s, __l):(<span>char</span>*)__s);\
         Z_TYPE_P(__z) = IS_STRING;              \
     } <span>while</span> (<span>0</span>)</code>

_estrndup定義

<code><span>#define estrndup(s, length) _estrndup((s), (length) ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC)</span></code>

_emallocなどの関連する関数定義を自分で検索することができます。

上記では、PHP 拡張機能の開発ノート (6) ZVAL_STRING と ZVAL_STRINGL を、関連する内容も含めて紹介しています。PHP チュートリアルに興味のある友人に役立つことを願っています。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。