Предположим, у меня есть «тяжелая» запись, например, содержащая массивы динамических массивов с кратным числом. Я заявляю это так:Функция должна возвращать запись или указатель?
PMyHugeRecord^ = TMyHugeRecord;
TMyHugeRecord = record
AFirstArray: TSingleDynArray;
// many many others
...
ALastArray: TSingleDynArray;
end;
Хотя обработка происходит в функции, если результат функции наберется как указатель, или она может возвращать переменную запись?
function MyFunctionWhichCalculates: TMyHugeRecord;
// or
function MyFunctionWhichCalculates: PMyHugeRecord;
Я имею в виду производительность, особенно, чтобы избежать переполнения стека. Другими словами, возвращает ли функция результат по ссылке или по значению?
Просто, чтобы указать, что запись, которую вы описали, может быть не такой «тяжелой», как вы думаете. Динамические массивы распределяются по куче и подсчету ссылок. Ваша структура записи содержит «светлые» ссылки на массивы. Аналогично для строк по умолчанию (длинные строки). Однако, если у вас есть фиксированные массивы размера, ваша структура может быть большой. Вы можете использовать 'SizeOf (...)' для определения размера вашего массива. –
Вы правы, и мой пример был не лучшим. Действительно, мои записи могут представлять собой набор различных типов данных, включая массивы фиксированного размера и даже другие записи. Я, возможно, вызвал «огромный» термин, но я всегда заинтересован в оптимизации моего кода. – paradise
Единственный надежный способ оптимизации вашего кода - использовать комбинацию бенчмаркинга и профилирования и проверить разницу в конкретных изменениях. Интуиция часто может вводить в заблуждение. Я не могу подчеркнуть, что вы легко сохраняете большую часть своего кода, чтобы было спокойно *** безопасно *** настраивать свой код в тех местах, где вам нужно точно настроить производительность. –