Если это критическая для производительности функция, и в 99% случаев вызывается f (3) или f (5), и вы пытаетесь оптимизировать, вы должны измерить разницу таких вызовов. Если f () является встроенной функцией, оптимизатор может работать с вашей константой лучше, чем с переменной, чтобы некоторые ее функции оценивались во время компиляции (например, постоянное свертывание, уменьшение прочности и т. Д.). Это может быть полезно Godbolt.org, чтобы посмотреть на сборку и посмотреть, есть ли очевидные улучшения. LTO также может помочь, даже если он не указан, хотя разные люди сообщают об этом на разных уровнях успеха.
Если вы не видите значительных улучшений, но думаете, что некоторые могут заранее знать x, вы можете также написать различные специализированные версии f (), такие как f3 () и f5 (), которые оптимизированы для этих случаев. (хотя вы могли бы также получить более крупную инструкцию и иметь проблемы с кэш-памятью. Все сводится к измерению того, что вы пытаетесь, и пониманию того, в чем заключаются преимущества (и потери). Самое важное - это измерить. Не так-то сложно сделать код сложным для нет выигрыша (или хуже, чтобы замедлить его во имя оптимизации.)