php源码学习d6 字符串2

1.柔性数组

struct _zend_string {
 zend_refcounted_h gc; /* 垃圾回收 */
 zend_ulong h; /* hash value */
 size_t len; // 存长度,内存占用8
 char val[1]; // 柔性数组 比char* 指针的好处,地址连续,从内存取一次即可
};

char val[] 不占内存

char var[1] 占内存

char var[0]

三种写法一致,只是为了兼容不同的编辑器

PHP中的字符串的结构决定字符串变量申请内存时是连着后边字符实际所占内容一块申请,即

lenth(_zend_string)+len+1

2.redis

采用简单动态字符串sds存储字符串,它采用预分配冗余空间的方式来减少内存的频繁分配.

3.写时复制

申明任何变量内存占用都是16字节,但是声明字符串等复杂类型的时候需要考虑其中引用指向地址的内存。

$a = 10;
echo $a;
$b = $a;  // 直接复制
echo $b;

$a = 'sting'.date('y-m-d');
echo $a;
$b = $a;  //不复制 变量的地址不同,指向的字符串地址一样
echo $b;
$b = 'abcd'; // 复制, a,b指向的字符串地址变了
echo $a;
echo $b;

疑问:为什么第三种第一次$a 的引用是1,$b的引用是1

$a = 'string';
echo $a;
$b = $a;  //不复制 变量的地址不同,指向的字符串地址一样
echo $b;
$b = 'abcd'; // 复制, a,b指向的字符串地址变了,自变量flags标识,不用refcount 区别于date() 变量
echo $a;
echo $b;

4.符号表

php7中有一个符号表(hashtable类型)来存储变量名字, val是变量,key是变量的地址。$_GET等7个全局变量也存里边,如下图

5.引用

$a  = 1;
echo $a; // type = 4 IS_LONG 整型
$b = &$a;
echo $a;// type = 10 IS_REFERENCE 引用
echo $b; // type = 10 IS_REFERENCE 引用
unset($b)
echo $b; // type = 0 IS_UNDEF undefined
$c =$a;
echo $a; // 10 地址改变
echo $c; // type = 4 IS_LONG 整型
$a = 1;
$b = &a; // type = 10 IS_REFERENCE 引用
$c = &b; // type = 10 IS_REFERENCE 引用,不是引用的应用
 

6.\0 是一个字符

7.扩展

// ab公用,不会存两份
$a = 'abcd';
echo $a; 
$b = 'abcd';
echo $b;

 

8.笔记地址

d6 字符串2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值