PHP 확장 개발 참고 사항(6) ZVAL_STRING 및 ZVAL_STRINGL

WBOY
풀어 주다: 2016-08-08 09:22:36
원래의
1742명이 탐색했습니다.

문자열 처리는 우리에게 일반적인 작업이며 zend는 문자열 작업과 관련된 많은 매크로를 캡슐화합니다.

<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>
로그인 후 복사

문자열 작업이 많기 때문에 먼저 ZVAL_STRING 및 ZVAL_STRINGL을 살펴보겠습니다. PHP 내부(예: substr)는 최종적으로 이러한 매크로에 제공되어 작동하므로 여기서 이 두 매크로를 이해하는 것이 매우 중요합니다.

ZVAL_STRINGL 처리 시 길이 매개변수가 주어지기 때문에 문자열의 길이를 찾기 위해 strlen을 사용할 필요가 없어 성능이 향상됩니다.

앞서 일반적으로 사용되는 zend API에서 언급했듯이 estrndup도 캡슐화되어 있습니다. PHP 확장을 개발할 때 메모리를 최적화하고 메모리를 줄일 수 있는 시스템 캡슐화 기능을 사용해 보세요. e*가 개발한 기능. 이전 관련 기사를 읽을 수 있습니다.

estrndup 정의

<code><span>#define estrndup(s, length) _estrndup((s), (length) ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC)</span></code>
로그인 후 복사

_estrndup 정의

<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>
로그인 후 복사

_emalloc 등 관련 함수 정의를 직접 검색할 수 있습니다.

위 내용은 PHP 확장 개발 노트(6) ZVAL_STRING 및 ZVAL_STRINGL을 관련 내용을 포함하여 소개하고 있으며, PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿