與其他語言不同,Chapel中沒有allocate
或new
語法用於在堆上分配數組,而是使用通常的「聲明」類語法。例如,在下面的代碼,I「聲明」兩個陣列在功能A
和B
基於正式(虛設)參數:在Chapel中分配數組
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
手動這些陣列,但根據需要而系統會自動解除分配它們?
非常感謝您的解釋。我認爲有趣的是,賦值域變量意味着對數組(或與該域相關聯的所有數組)進行「調整大小」,並且自動完成必要的分配/重新分配。謝謝:) – roygvib
[順便說一下,第一段中的下列句子「請注意,雖然數組的元素分配在_stack_上」可能是「請注意,儘管數組的元素分配在_heap_上」 ? (儘管它可能取決於解釋的上下文)] – roygvib
感謝您指出我修復的拼寫錯誤。一旦域使用某種語言,它們似乎是調整數組大小的最自然/最明顯的方式,即使有一些學習曲線可以適應它。 – Brad