Ответ 1
RenameFile
является встроенным, потому что это простой вызов другой функции.
Вот как это выглядит:
function RenameFile(const OldName, NewName: string): Boolean;
{$IFDEF MSWINDOWS}
begin
Result := MoveFile(PChar(OldName), PChar(NewName));
end;
Встраивая эту функцию, вызов SysUtils.RenameFile
заменяется вызовом WinApi.Windows.MoveFile
.
Это имеет следующие преимущества:
- Вы сохраняете вызов, вместо двух вызовов вы имеете только один вызов.
- Ваш кодовый код имеет точно такой же размер.
- ЦП хранит список обратных адресов для предсказания ветвлений (буфер буфера возврата); устраняя избыточный вызов, он экономит место в этом буфере, это предотвращает неправильное предсказание, если стек вызовов становится слишком глубоким.
- Сгенерированный код меньше, потому что сам
RenameFile
устраняется.
Таким образом, вставка очень важна, особенно в рекурсивном коде, где стек вызовов может получить глубокий процессор, который начнет неверно прогнозировать возврат, потому что переполнение буфера возврата (у некоторых процессоров есть только 8 записей, верхняя часть линии CPU имеют 24 записи).
Как правило, каждая подпрограмма, которая просто вызывает другую процедуру, всегда должна быть встроена.
Правильно спрогнозированная стоимость возврата стоит один цикл, неверный прогноз опустошает трубопровод и стоит 25 циклов или более; добавляются дополнительные задержки, потому что обратный адрес нужно извлекать из памяти, а не из буфера.
Вы правы, что ни одно из этих преимуществ не имеет значения в коде IO на диске, но это не умаляет того факта, что простые функции перенаправления, подобные этому, всегда должны быть встроены.