String-Verarbeitung ist für uns eine gängige Operation, und Zend kapselt viele Makros im Zusammenhang mit String-Operationen. Schauen wir uns zunächst ZVAL_STRING und ZVAL_STRINGL an.
<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>
Weil es viele String-Operationen gibt Innerhalb von PHP (z. B. substr) werden schließlich solche Makros für den Betrieb bereitgestellt, daher ist es hier sehr wichtig, diese beiden Makros zu verstehen.
Wenn ZVAL_STRINGL verarbeitet wird, ist es nicht erforderlich, strlen zum Ermitteln der Länge der Zeichenfolge zu verwenden, da der Längenparameter angegeben ist, und die Leistung wird verbessert.
Wie bereits erwähnt, ist estrndup auch in der PHP-Erweiterung gekapselt. Versuchen Sie, systemgekapselte Funktionen zu verwenden, die den Speicher optimieren und Speicherverluste reduzieren können Von e* entwickelte Funktionen. Sie können frühere verwandte Artikel lesen.
estrndup-Definition
<code><span>#define estrndup(s, length) _estrndup((s), (length) ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC)</span></code>
_estrndup-Definition
<code> ZEND_API <span>char</span> *_estrndup(<span>const</span><span>char</span> *s, uint length ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC) { <span>char</span> *p; <span>#ifdef ZEND_SIGNALS</span> TSRMLS_FETCH(); <span>#endif</span> HANDLE_BLOCK_INTERRUPTIONS(); p = (<span>char</span> *) _emalloc(length+<span>1</span> ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC); <span>if</span> (UNEXPECTED(p == NULL)) { HANDLE_UNBLOCK_INTERRUPTIONS(); <span>return</span> p; } <span>memcpy</span>(p, s, length); p[length] = <span>0</span>; HANDLE_UNBLOCK_INTERRUPTIONS(); <span>return</span> p; }</code>
Sie können selbst nach verwandten Funktionsdefinitionen wie _emalloc suchen.
Das Obige stellt die PHP-Erweiterungsentwicklungshinweise (6) ZVAL_STRING und ZVAL_STRINGL vor, einschließlich relevanter Inhalte. Ich hoffe, dass es für Freunde hilfreich ist, die an PHP-Tutorials interessiert sind.