这个索引是一个对应数据的地址,不可以省的
这个是有些算法在里面处理的
你中间是不是直接跳过e了
zend
这个-g 不友好
存在数组中更好操作数据呀
如果$a是int类型,那么$c会直接复制一份$a的zval,这个在实战课程里面讲了,简单类型是直接复制,不是写是复制的
这个要操作模板了
xdebug出来的数据不够全面,在php7.1.x中,常量字符串的refcount是0,可以GDB试试
还需要添加一个参数 --enable-debug
计算方式是:
nIndex = h | ht->nTableMask;
表示的是,hash值 或上 tablemask就可以得到索引数组的位置。
十六个字节是以0x开头的
网上的资料非常多, 我转一篇http://www.cnblogs.com/wuyuegb2312/archive/2013/06/08/3126510.html 你看看哈, 有问题可以一起探讨。
sublime_text 就可以。只是一个编辑器而已,有很多啦。
非常感谢, 替换完以后确实是
consistency;nIteratorsCount;nApplyCount; flags
在此感谢指正。
问题一:$arr[2]取得值是‘abc’还是‘bar’? 使用$arr[2]取的值还是‘abc’ 但是请注意,在底层的hashtable中,abc被放在第1个位置,当我们通过$arr[2]取值的时候, h值是2,2|-8=-6 从前面的索引数组中取-6的位置,是1; 然后从arData[1]取出来,h=2跟我们的$arr[2]里面的2相等,这时候没有发生冲突,因此,值就是我们要的,可以打印出来就是"abc",具体可以看下图:
问题二:从上图可以看出, "abc"对应的key是0x0 h是2.
看一下是不是能解决你的疑问呢?
在php7.1.0中比较特殊,常量字符串的refcount是0, 见课程里面的打印:
可以这么简单的理解:
1、对于key是数字的,就不用涉及到hash运算,此时使用的是packed array; 当然如果key的值较大,或者间隔较大,还是会退化成hash array。 packed array 能够节省索引部分占用的内存,是一个性能上的优化;
2、对于key是非数字的,必须用hash算法进行计算出来它所在bucket的位置,那么索引数组是必不可少的,只能是hash array。
这是底层的实现,对于我们写php代码,需要关注的点是对于业务中的大数组,有没有可能设计一些算法,让它满足packed array的性质,这样可以节省内存; 另外一方面就是要关注在大数组的情况下,可能会发声packed array向 hash array的转变,这个耗时还是较大的,需要尽量避免这种情况。 当然这两种情况都是针对“大”数组,小数组的情况下,其实差距没那么大。
雷哥,实战什么时候出?
结构体(使用关键字 struct),是C语言里的东西,C语言不是面向对象的。C语言发明时候,还没有面向对象概念。
后来出现语言C++,Java,C#等为标准,你可以把结构体和类(使用关键字class)对比起来。
不难发现,结构体是公有的,数据和函数都可以被结构体外函数使用。在现在软件工程理论里,这被认为是不规范。所以后期语言都有class,默认私用。
是的 初始的时候时候Packed Array的。 直接动手实验,很赞!