Размещение массивов в Часовне

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


person roygvib    schedule 06.06.2017    source источник


Ответы (1)


Можно ли предположить, что приведенный выше синтаксис всегда выделяет A и B в куче независимо от их размера?

В версии Chapel 1.15.0 элементы массива Chapel всегда размещаются в куче. Мы обсудили добавление механизмов (например, карты пользовательских доменов) или, возможно, оптимизации, которые можно было бы использовать для хранения элементов массивов в стеке, когда это уместно, но пока не занимались такими функциями. Обратите внимание, что хотя элементы массива размещаются в куче, массивы также реализуются с использованием дескриптора времени выполнения, который выделяется «на месте» (например, в стеке в ваших примерах) — этот дескриптор относится к элементам, выделенным в куче. .

Кроме того, назначение (или переназначение) переменной домена, по-видимому, играет роль выделения (или перераспределения) массива.

Это верно, и стоит подчеркнуть, что это логически, а не физически понятие перераспределения. В частности, когда домен массива переназначается, A[i] будет продолжать хранить одно и то же значение, если i был в обоих наборах индексов старого и нового домена. Вот почему, когда вы изменили domC с {1..3} на {-1..5} в приведенном выше коде, A[1..3] было сохранено, так как оно представляет собой пересечение двух наборов.

Всегда ли выделение происходит в куче (опять же)?

Да, как и при начальном размещении массива.

не нужно ли пользователю освобождать или удалять эти массивы вручную, а система автоматически освобождает их по мере необходимости?

Это правильно, управление памятью массива обычно обрабатывается реализацией. Способ ручного управления памятью массива состоял бы в том, чтобы иметь переменную класса с полем массива (поскольку классы управляются памятью вручную).

person Brad    schedule 06.06.2017
comment
Большое спасибо за ваши объяснения. Мне кажется интересным, что присваивание переменной домена означает изменение размера массива (или всех массивов, связанных с доменом), а также автоматически выполняется необходимое распределение/перераспределение. Спасибо :) - person roygvib; 06.06.2017
comment
[Кстати, следующее предложение в первом абзаце. Обратите внимание, что хотя элементы массива размещаются в стеке, может быть опечаткой. Обратите внимание, что хотя элементы массива размещаются в куче< /i> ... ? (хотя это может зависеть от контекста объяснения)] - person roygvib; 06.06.2017
comment
Спасибо за указание на опечатку, которую я исправил. Как только домены находятся на языке, они кажутся наиболее естественным/очевидным способом изменения размера массива, даже если к нему нужно привыкнуть. - person Brad; 06.06.2017