Большая часть оптимизации кода не может произойти во время выполнения, по крайней мере, не так, как вы имеете в виду.Код не может измениться во время выполнения, чтобы отразить новый или другой набор переменных, которые просто создали бы беспорядок.
Что можно сделать во время выполнения, так это выбрать лучший путь через код, но этоэто должно быть сделано в основном вручную, чтобы создать отдельные пути, ранние выходы, ветви и т. д. для оптимизации.
Код, подобный этому, как написано, позволяет оптимизировать время компиляции, поскольку компилятор может проверять любойвозможные альтернативные значения abc
и, если ничего не найдено, оптимизировать вызов.Однако объем поиска сильно влияет на то, может ли это произойти, и настройки компилятора влияют на это.
Если компилятор просто наивно оптимизирует отдельные объектные файлы, а ваша вторая строка находится в другом файле из раздела печати,тогда он не сможет гарантировать, что abc
не изменится, и поэтому не сможет оптимизировать это вообще.Независимо от использования переменных, это зависит от того, насколько агрессивны ваши настройки компилятора и разрешено ли им сбрасывать мертвые ветви, или рассмотрит это.Оптимизация по размеру может с большей вероятностью удалить ветку, чем по скорости, но средние / высокие настройки, скорее всего, сделают это в любом случае (если возможно).
У большинства современных компиляторов есть опция оптимизации всей программы,задерживает большую часть оптимизации до стадии компоновщика.Это позволяет ему выполнять поиск по всей программе, потенциально обнаруживать, что abc
никогда не изменяется и не используется где-либо еще, и удалять переменную и ошибочную ветвь из условия.Оптимизация всей программы может быть гораздо более эффективной, чем отдельная оптимизация для каждого объекта, поскольку она позволяет более точный поиск.
В случае, когда компилятор не может обрезать мертвый код, вы можете либо намекнуть на это (последние конструкции, такие как constexpr
, могут помочь в этом) или добавить оптимизации самостоятельно.Это может быть так же просто, как сначала указать наиболее вероятный путь и включить возврат перед другим, что избавит процессор от скачка.Такая микрооптимизация вряд ли понадобится, конечно, не в таком простом примере, как этот, где if
само по себе является достаточной оптимизацией.