Im Gegensatz zu anderen Sprachen scheint keine allocate
oder new
Syntax in Chapel für die Zuweisung von Arrays auf dem Heap, sondern verwenden Sie die übliche "Deklaration" -ähnliche Syntax. Zum Beispiel in dem folgenden Code, ich "erklären" zwei Arrays A
und B
in einer Funktion auf der Grundlage formale (Dummy) Argumente:Zuordnung von Arrays in 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
Dies ergibt folgendes Ergebnis:
A.domain = {1..3}
B.domain = {2..5}
A.domain = {1..10000000}
B.domain = {-10000000..10000000}
Da keine Stack-Überlauf tritt auf (trotz der großen Größe von B
), ist es in Ordnung, davon auszugehen, dass die obige Syntax immer A
und B
auf dem Heap unabhängig von ihrer Größe zuweist?
Auch die Zuweisung (oder Neuzuweisung) einer Domänenvariable scheint die Rolle der Zuweisung (oder Neuzuordnung) eines Arrays zu spielen. Der folgende Code funktioniert beispielsweise wie erwartet. Findet die Zuordnung in diesem Fall immer wieder auf dem Heap statt?
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);
Ergebnis:
C =
C = 7.0 7.0 7.0
C = 0.0 0.0 7.0 7.0 7.0 0.0 0.0
Schließlich ist es nicht notwendig für den Benutzer zu deallocate
oder delete
diese Arrays manuell, sondern das System plant sie bei Bedarf automatisch?
Vielen Dank für Ihre Erklärungen. Ich denke, es ist interessant, dass die Zuweisung einer Domain-Variablen "Größe" des Arrays (oder aller mit der Domain assoziierten Arrays) bedeutet und auch die notwendige Zuweisung/Neuzuweisung automatisch erfolgt. Danke :) – roygvib
[Übrigens, der folgende Satz im ersten Absatz "Beachten Sie, dass, während die Elemente des Arrays auf dem _stack_ zugewiesen sind" könnte ein Tippfehler sein von "Beachten Sie, dass während die Elemente des Arrays auf der Heap_ zugeordnet sind" ... ? (obwohl es vom Kontext der Erklärung abhängig sein kann)] – roygvib
Danke für den Hinweis auf den Tippfehler, den ich behoben habe. Sobald Domains in einer Sprache sind, scheinen sie die natürlichste/offensichtlichste Möglichkeit zu sein, ein Array zu skalieren, obwohl es eine gewisse Lernkurve gibt, um sich daran zu gewöhnen. – Brad