background image
在数组和哈希表上工作
C 语言中, 有两种不同的基础方法用来在一个结构体中存储任意数量的独立数据元素.
两种方法都有赞成者和反对者
.
向量
Vs. 链表
应用的编写通常基于特定类型数据的特性的选择
, 需要存储多少数据, 以及需要多快速
度的检索
. 为了能够有对等的认知, 我们先来看看简单的看看这些存储机制.
向量
向量是一块连续的内存空间
, 它们包含的数据有规律的间隔. 向量最常见的例子就是字
符串变量
(char *或 char []), 它包含了一个接着一个的字符(字节)序列.
char foo[4] = "bar";
这里
, foo[0]包含了字符'b'; 紧接着, 你将在 foo[1]中找到字符'a', 最后在 foo[3]中是一个
空字符
'\0'.
将指向其他结构的指针存储到向量中的用法几乎是无所不在的
, 比如在上一章, 使用
zend_get_parameters_array_ex()函数时, 就使用了一个 zval 的向量. 那里, 我们看到
var_dump()定义了一个 zval ***的函数变量, 接着为它分配空间用来存储 zval **指针(最终的
数据来自
zend_get_parameters_ex()调用)
zval ***args = safe_emalloc(ZEND_NUM_ARGS(), sizeof(zval**), 0);
和访问字符串中的数组一样
, var_dump()实现中使用 args[i]依次传递每个 zval **元素到
内部函数
php_var_dump().
向量最大的优点在于运行时单个元素的访问速度
. args[i]这样的变量引用, 可以很快的
计算出它的数据地址
(args + i * sizeof(args[0]). 这个索引结构的空间分配和释放是在单次,
高效的调用中完成的
.
链表