Предполагая, что вы можете поместить всю структуру данных в непрерывный блок памяти, вы можете выполнить выделение за один снимок и затем выполнить индексацию.
Примечание :Даже если вы не можете разместить данные в одном непрерывном блоке памяти, вы все равно можете использовать эту технику, выделив несколько больших блоков и затем сложив их вместе.
Сначала сформируйте вспомогательный массив,colIndex
, который должен содержать индекс первого столбца каждой строки.Установите длину от colIndex
до RowCount+1
.Вы строите это, устанавливая colIndex[0] := 0
, а затем colIndex[i+1] := colIndex[i] + ColCount[i]
.Сделайте это в цикле for, который работает до RowCount
включительно.Итак, в последней записи, colIndex[RowCount]
, вы сохраняете общее количество элементов.
Теперь установите длину a равной colIndex[RowCount]
.Это может занять некоторое время, но это будет быстрее, чем вы делали раньше.
Теперь вам нужно написать пару индексаторов.Поместите их в класс или запись.
Получатель выглядит следующим образом:
function GetItem(row, col: Integer): Word;
begin
Result := a[colIndex[row]+col];
end;
Установщик очевиден.Вы можете встроить эти методы доступа для повышения производительности.Предоставьте их как индексированное свойство для удобства клиентов объекта.
Вы захотите добавить код, чтобы проверить правильность row
и col
.Вам нужно использовать colIndex
для последнего.Вы можете сделать эту проверку необязательной с помощью {$IFOPT R+}
, если хотите имитировать проверку диапазона для собственной индексации.
Конечно, это полный старт, если вы хотите изменить любой из ваших столбцов после начальногоконкретизация!