Оптимизация вызовов подпрограмм

Вызов подпрограммы имеет значительную продолжительность перегрузки, включая передачу аргументов, переход к подпрограмме и возврат к вызывающей стороне. Перегрузка часто включает в себя сохранение и восстановление определенных регистров процессора , выделение и возврат памяти вызывающего кадра и т. д. В некоторых языках каждый вызов подпрограммы включает автоматическое тестирование возвращаемого кода подпрограммы или обработку исключительных ситуаций, которые могут возникнуть. В объектно-ориентированных языках существенным источником перегрузки являются часто используемые динамические объявления для вызовов методов.

Есть некоторые, казалось бы, очевидные оптимизации пошаговых вызовов, которые нельзя реализовать, если процедура может иметь нежелательные эффекты. Например, в выражении (f(x)-1)/(f(x)+1)функция fдолжна быть вызвана дважды, так как два вызова могут возвращать разные результаты. Кроме того, значение k должно быть получено перед вторым вызовом, так как первый вызов мог изменить его. Определить, может ли подпрограмма иметь нежелательный эффект, очень сложно (на самом деле, нерешительно). Таким образом, в то время как эти оптимизации безопасны в чисто функциональных языках программирования, компиляторы типичного императивного программирования обычно должны предполагать худшее.

Оптимизация вызовов подпрограмм

Выравнивание: метод, используемый для устранения перегрузки, — это выровненное расширение или выравнивание тела подпрограммы в каждой точке вызова (в отличие от перехода к подпрограмме и обратно). Это не только позволяет избежать перегрузки вызовов, но также позволяет компилятору более эффективно оптимизировать тело шага, принимая во внимание контекст и аргументы этого вызова. Введенное тело может быть оптимизировано компилятором. Однако выравнивание обычно увеличивает размер кода, если программа содержит только один вызов подпрограммы или тело подпрограммы имеет меньший размер кода, чем перегруженный вызов.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *