Was man noch machen kann, wenn das Array immer „rechteckig“ ist, ist, kein Array of Array zu nehmen, sondern den ganzen Speicherbereich am Stück anzufordern, und dann den Index von Hand (bzw. über entsprechende Getter und Setter) auszurechnen.
Statt:
Delphi-Quellcode:
var a: array of array of integer;
SetLength(a, rows);
for i := 0 to rows - 1 do
SetLength(a[i], cols);
So:
Delphi-Quellcode:
var a: array of integer;
SetLength(a, rows*cols);
a[y,x] im ersten Beispiel entspricht dann a[y*cols + x] im zweiten Beispiel. Dadurch spart man erstens die Pointer-Dereferenzierungen auf der ersten Ebene, und außerdem ist der Zugriff auf die Elemente cacheeffizienter, weil es zwischendrin keine Lücken gibt. Beim naiven Ansatz könnte der Speichermanager die Unterarrays sonstwohin verstreuen.
Außerdem kann man das ganze Array dann mit einem einzigen Aufruf von FillChar nullen und braucht dazu keine äußere Schleife mehr.