PHP内核之旅-4.可变长度的字符串

一、字符串源码

 zend_string

1 typedef struct _zend_string     zend_string; //定义 zend_string变量
2 struct _zend_string { //_zend_string结构体
3     zend_refcounted_h gc;
4     zend_ulong        h;                /* hash value */
5     size_t            len;
6     char              val[1];
7 };

变量

描述

1

gc

变量的引用计数信息,内存管理会用到

2

h

harh code, 字符串通过Times33算法计算得到的

3

len

字符串的长度

4

val[1]

字符串的内容

二、字符串结构

注意:

1. zend_string = 引用计数 + 字符串hash code + 字符串长度 + 字符串内容。

2. 字符串val是一个可变数组,val[1]表示默认存放'\0' 字符串结束符。

3. val[0]存放空字符串。当字符串不为空时,val[0 ~ len]存放的是字符串内容。val[len+1] = '0\'

比如'test'字符串是这样存放的:

val[0] = 't'

val[1] = 'e'

val[2] = 's'

val[3] = 't'

val[4] = '\0'  字符串结束符

参考资料:

http://www.php-internals.com/

PHP7内核剖析

作  者: Jackson0714 出  处:http://www.cnblogs.com/jackson0714/ 关于作者:专注于微软平台的项目开发。如有问题或建议,请多多赐教! 版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。 特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信我 声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是作者坚持原创和持续写作的最大动力!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Jackson0714

PHP内核之旅-4.可变长度的字符串

3056
来自专栏Python与爬虫

爬虫入门到精通-网页的解析(正则)

本文章属于爬虫入门到精通系统教程第五讲 在爬虫入门到精通第四讲中,我们了解了如何下载网页(http://mp.weixin.qq.com/s?__biz=M...

43318
来自专栏我的技术专栏

《effective Go》读后记录:GO基础

2144
来自专栏软件测试经验与教训

上期答案

3355
来自专栏Python小屋

详解Python序列解包(3)

本文主要介绍调用函数传递参数时序列解包的用法。在调用函数传递参数时,可以在实参序列前加一个星号*进行序列解包,或在实参字典前加两个星号**进行解包,本文介绍第一...

2794
来自专栏前端菜鸟变老鸟

ES6(二):Promise

ES6之前解决异步编程只能使用回调函数或事件,ES6中加入了 Promise,使得异步编程更加简洁直观和合理

1133
来自专栏漫漫前端路

当 Vue 处理数组与处理纯对象的方式一样

当给数组设置 length 时,如果大于数组本身长度,新元素则会以 empty 填充,如下所示:

1122
来自专栏PhpZendo

带你玩转 JavaScript ES6 (七) – 异步

本章我们将学习 ES6 中的 Promise(异步) 相关知识,了解如何使用 Promise 对象创建异步程序

591
来自专栏zingpLiu

浅谈JavaScript词法分析步骤

JavaScript代码运行前有一个类似编译的过程即词法分析,词法分析主要有三个步骤:

985
来自专栏架构说

声明和定义的区别(深入理解)

问题 声明和定义区别 definition declared 微信排版支持makdown语法不友好 可以查看原文链接 先看一下 例子1 编译有没有问题? cl...

26910

扫码关注云+社区