Я пытаюсь написать программу в функциональном стиле с C как можно больше. Я знаю, что мелкие компиляторы, такие как GCC/Clang, делают оптимизацию звонка, но это не гарантируется. Есть ли опция принудительного оптимизации хвостового вызова для компиляторов? (Конечно, когда только это называется в самом конце)Можно ли оптимизировать оптимизацию хвоста на GCC/Clang?
ответ
Clang не делает никаких оптимизаций вообще. Есть пропуск LLVM tailcallelim
, который может делать то, что вы хотите (но это не гарантируется). Вы можете запускать его отдельно с помощью opt
.
Что такое выбор? Могу ли я иметь для этого ссылку? – Eonil
opt - инструмент командной строки, поставляемый с llvm, http://llvm.org/cmds/opt.html –
Альтернативно вы можете настроить драйвер clang, чтобы убедиться, что он явно пропустил этот проход. –
На самом деле многие компиляторы для C уже справляются с этим для вас. Как упоминалось выше, вы можете также позволить компилятору обрабатывать большинство этих вещей, а не пытаться создавать оптимизации, которые не будут работать в другом месте. Часто вы найдете, даже если вы установите флаги оптимизации, что на самом деле нет разницы в производительности.
Меты ответ:
Есть некоторые уроки полезно взять на себя в C из функциональных языков: использовать небольшие функции, использовать функции, которые не мутировать либо глобал или входные аргументы, не испугаться указатели функций. Но есть предел тому, что вы можете здесь сделать разумно, и полагаться на устранение хвостового вызова («оптимизация » на самом деле не является правильным термином), вероятно, выходит за рамки того, что полезно. Вы не можете заставить компилятор использовать эту стратегию, и даже если бы вы могли, результат C был бы крайне унииоматичным и трудночитаемым для других, включая ваше будущее.
Используйте языки на свой выбор. C - хорошо для некоторых вещей, поэтому используйте его для тех, в хорошем стиле C. Если вам нужны разные сильные стороны, или если вы хотите использовать функциональный стиль (отличное решение!), Используйте функциональный язык.
Если это действительно хвост, тогда цикл while или goto не будет выглядеть так сильно, как рекурсивный вызов. Просто обновите все переменные вместо передачи их в качестве параметров. AFAIK это единственный кросс-платформенный способ в C для управления использованием стека на всех уровнях оптимизации. Это действительно может быть более читаемым, так как у вас есть одна функция с инициализацией, за которой следует цикл, который довольно идиоматичен. Для хвостовой рекурсивной версии требуются две функции: одна для инициализации и одна для рекурсивной части.
- 1. Выполняет ли Rascal оптимизацию хвоста?
- 2. Можно ли оптимизировать «неиспользуемый» объект?
- 3. Можно ли это оптимизировать?
- 4. Можно ли оптимизировать этот алгоритм?
- 5. Можно ли оптимизировать рекурсивный союз?
- 6. Можно ли оптимизировать этот цикл?
- 7. Можно ли оптимизировать этот JQuery
- 8. Можно ли оптимизировать этот MDX?
- 9. Можно ли оптимизировать этот код?
- 10. Можно ли оптимизировать этот код?
- 11. Можно ли оптимизировать функцию для рекурсии хвоста, даже если существует несколько отдельных рекурсивных вызовов?
- 12. Можно ли оптимизировать этот запрос?
- 13. Можно ли оптимизировать этот код?
- 14. Можно ли оптимизировать стандартный Ackermann?
- 15. Можно ли оптимизировать этот запрос?
- 16. Можно ли оптимизировать этот код?
- 17. ли Xcode для iPhone устраняет рекурсию хвоста?
- 18. Есть ли способ отключить оптимизацию хвостовой рекурсии Scala Compiler?
- 19. Можно ли оптимизировать время компиляции с оптимизацией времени соединения?
- 20. Выполняет ли оптимизатор Delphi оптимизацию?
- 21. Запрос на оптимизацию MySQL
- 22. Можно ли оптимизировать таблицу mysql/myisam?
- 23. Можно ли оптимизировать эти простые HtmlHelpers?
- 24. Можно ли оптимизировать этот код cython?
- 25. Можно ли оптимизировать этот простой SQL-запрос?
- 26. Можно ли оптимизировать этот код OpenCL?
- 27. Можно ли оптимизировать/упорядочить этот фрагмент?
- 28. Можно ли оптимизировать это с помощью Generics?
- 29. Можно ли оптимизировать этот оператор SQL?
- 30. Можно ли оптимизировать эти вызовы базы данных?
Компилятор, вероятно, довольно умный в этом отношении, просто доверяйте ему. Нет необходимости в * не переносных * хаках. –
Что вы хотите сделать в случаях, когда вы думаете, что оптимизация хвоста должна произойти, но компилятор не способен это сделать (по какой-либо причине)? –
@ Michael Я ожидал ошибку времени компиляции, если оптимизация принудительного хвостового вызова невозможна. – Eonil