与其他语言不同,Chapel 中似乎没有用于在堆上分配数组allocate
的new
语法,而是使用通常的类似“声明”的语法。例如,在下面的代码中,我“声明”了两个数组A
和B
一个基于形式(虚拟)参数的函数:
proc test( n, D )
{
var A: [1..n] real; // local array
var B: [D] real; // local array
writeln( "A.domain = ", A.domain );
writeln( "B.domain = ", B.domain );
}
test( 3, {2..5} ); // request small arrays
test( 10**7, {-10**7..10**7} ); // request large arrays
这给出了以下结果:
A.domain = {1..3}
B.domain = {2..5}
A.domain = {1..10000000}
B.domain = {-10000000..10000000}
因为没有发生堆栈溢出(尽管 的大小很大B
),所以可以假设上述语法总是在堆上分配A
,B
而不管它们的大小是多少?
此外,域变量的分配(或重新分配)似乎扮演着数组分配(或重新分配)的角色。例如,以下代码按预期工作。在这种情况下,分配是否总是发生在堆上(再次)?
var domC: domain(1);
var C: [domC] real;
writeln( "C = ", C );
domC = { 1..3 }; // assign a domain
C = 7.0; // assign some value to the array
writeln( "C = ", C );
domC = { -1..5 }; // re-assign a domain
writeln( "C = ", C );
结果:
C =
C = 7.0 7.0 7.0
C = 0.0 0.0 7.0 7.0 7.0 0.0 0.0
最后,用户是否不需要手动deallocate
或delete
这些数组,而是系统根据需要自动释放它们?