Возможно ли из нескольких TArray<> собрать один без копирования?

Рейтинг: 0Ответов: 1Опубликовано: 26.07.2023

Есть библиотека, где функции работают в духе

function Foo(Result: TArray<Double>; AnyData: ... ) 

принимая TArray и внутри заполняя его. Понадобилось сделать единый большой массив из нескольких вызовов Foo, возможно такое без копирования? В голову приходит только объявить большой массив и передавать указатели на его части. Но как такое сделать не пойму. Да и у TArray должна же инфа о длине хранится ещё.

Ответы

▲ 0

В голову приходит только объявить большой массив и передавать указатели на его части.

Хороший вариант, если вы заранее знаете верхнее ограничение на суммарную длину.

Но как такое сделать не пойму.

Через SetLength() устанавливаете нужную длину массива

В функции Foo добавляете ещё один параметр var N: Integer — количество уже занятых в массиве элементов.

Все обращения Result[i] заменяете на Result[N + i]

В конце функции Foo увеличиваете значение N на количество новых элементов.

В вызывающем коде соответственно заводите переменную N, и инициализируете её нулём перед первым вызовом Foo

Да и у TArray должна же инфа о длине хранится ещё.

Если речь про количество действительно занятых элементов, то оно будет в переменной N.

возможно такое без копирования?

Только если вы можете заранее определить ограничение на количество элементов. Изменение длины массива в сторону увеличения приводит к неявному созданию нового массива, и копированию элементов в него.