我已经搜索过,但没有得出任何结论:当我定义一个稀疏数组时,它是否保留了所有连续内存直到最大索引,或者仅在该特定索引处分配内存。
array[100000]="ID1"
array[1001]="ID2"
同样,当我对数组进行 for 循环时,它会扫描其中的所有索引数组[i]存在或者仅指向定义数组的索引对于前。 100000 和 1001。
for(i in array){...}
我必须在特定索引处存储一些值,但我担心内存分配,因此了解对我来说非常重要:在稀疏数组的情况下它实际上如何分配内存?
答案1
根据gawk
手动的,这是一个很好的通用awk
语言参考:
关于数组需要记住的一个重要方面是数组下标始终是字符串。
也就是说,awk
数组是总是联想的,数字键被字符串化。只有正在使用的键才会存储在数组中(也许还有一些额外的空间供将来使用)。数字索引不是连续的,因此稀疏数组不会比具有相同元素数量的另一个数组占用更多的空间。
至于循环,当使用语法for (k in array) {body}
这:
循环执行身体每个索引一次大批该程序以前使用过
同样,只有已使用的索引才会包含在数组迭代中。注意迭代顺序未定义, 然而;它不一定是数字或添加到数组的顺序。
答案2
与gawk
,来自其手册页有关数组,您可以阅读详细说明。
在大多数其他语言中,必须在使用前声明数组,包括它们包含多少元素或组件的规范。在这样的语言中,该声明会导致为那么多元素分配连续的内存块。通常,数组中的索引必须是正整数。例如,索引零指定数组中的第一个元素,该元素实际上存储在内存块的开头。索引一指定第二个元素,该元素存储在内存中紧邻第一个元素之后,依此类推。不可能向数组添加更多元素,因为它的空间只能容纳声明中给出的元素数量。 (某些语言允许任意起始和结束索引,例如“15 .. 27”,但数组的大小在声明数组时仍然是固定的。)
....
awk 中的数组不同——它们是关联的。这意味着每个数组都是对的集合:索引及其对应的数组元素值
因此,您可以定义一个数组而不指定其大小:
$ awk 'BEGIN{a[0]=1;a[10]=2;print length(a)}'
2
它不像perl
,它使用连续的内存块来存储数组:
$ perl -le '$a[0]=1;$a[10]=1;print ~~@a'
11
哈希与数组perl
非常相似gawk
:
$ perl -le '$a{0}=1;$a{10}=1;print ~~keys %a'
2
由于gawk
数组实现为哈希表,因此您可以在恒定时间内访问数组的任何元素,而与数组的大小无关。