В отличие от других языков, в 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
эти массивы вручную, а система автоматически освобождает их по мере необходимости?