> php教程 > php手册 > php内存管理简介

php内存管理简介

WBOY
풀어 주다: 2016-06-06 19:52:01
원래의
1448명이 탐색했습니다.

欢迎进入Linux社区论坛,与200万技术人员互动交流 >>进入 程序先创建一个$a变量, 然后赋值$a变量为‘HelloWorld'.然后创建$b变量,把$a变量赋值给$b变量。在这里我们要思考的是,现在内存情况是怎样的。假如$a变量的内存占用为22字节(假设值)的话,那$b占

欢迎进入Linux社区论坛,与200万技术人员互动交流 >>进入

    程序先创建一个$a变量, 然后赋值$a变量为‘HelloWorld'.然后创建$b变量,把$a变量赋值给$b变量。在这里我们要思考的是,现在内存情况是怎样的。假如$a变量的内存占用为22字节(假设值)的话,那$b占用多少字节呢? 22字节? 还是小于22字节呢? 答案是小于22字节。那PHP是怎样实现的呢?

    其实PHP是通过refcount来实现的。当一个变量赋值给另外一个变量的时候, PHP只是简单的把变量的refcount的值加1.使用的是zend_hash_add函数和ZVAL_ADDREF宏。详细可以参考以下代码:

    [php]

    {

    zval*helloval;

    MAKE_STD_ZVAL(helloval);

    ZVAL_STRING(helloval,“HelloWorld”,1);

    zend_hash_add(EG(active_symbol_table),“a”,sizeof(“a”),&helloval,sizeof(zval*),NULL);

    ZVAL_ADDREF(helloval);

    zend_hash_add(EG(active_symbol_table),“b”,sizeof(“b”),&helloval,sizeof(zval*),NULL);

    }[/php]

    从上面的代码可以看到变量是没有增加的, 依然是helloval一个变量。但是我们还可以看到通过ZVAL_ADDREF宏来增加了引用计数器。所以helloval->refcount++.而且这时候还通过zend_hash_add向活动符号表增加了一个符号名称为b的符号。所以这样就可以把内存使用减到最少。

    我们可以通过使用PHP的内置函数memory_get_usage()来验证一下。代码如下:

    [php]

   

    $m1 = memory_get_usage();

    $a = 1;

    $m2 = memory_get_usage();

    $b = $a;

    $** = memory_get_usage();

    echo $m2 - $m1 , “
”, $** - $m2;

    ?>[/php]

    实验证明我们的说法是对的!

    那么$b什么时候才可以变成真正的变量呢? 我们可以使用把$b赋值一个新的值:

    [php]

   

    $a = 1;

    $b = $a;

    $b = 2;

    ?>[/php]

    这样就可以在内存里分配新的空间了!

php内存管理简介

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