Устранение мертвого кода


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

Простой анализ использования значений показал бы, что значение bпосле первого присваивания не используется внутри foo. Кроме того, bобъявлена ​​как локальная переменная внутри foo, поэтому ее значение нельзя использовать снаружи foo. Таким образом, переменная bмертва , и оптимизатор может освободить ее место для хранения и исключить ее инициализацию.

Более того, поскольку первый оператор return выполняется безоговорочно, ни один возможный путь выполнения не достигает второго присваивания b. Таким образом, задание недоступно и может быть удалено. Если бы процедура имела более сложный поток управления , например, метку после оператора return и где-то gotoеще в процедуре, то для присваивания мог бы существовать возможный путь выполнения b.

Кроме того, несмотря на то, что в функции выполняются некоторые вычисления, их значения не сохраняются в местах, доступных вне области действия этой функции. Кроме того, поскольку функция возвращает статическое значение (96), ее можно упростить до возвращаемого значения (это упрощение называется свертыванием констант ).

В большинстве продвинутых компиляторов есть опции для активации удаления мертвого кода, иногда на разных уровнях. Нижний уровень может удалять только инструкции, которые не могут быть выполнены. Более высокий уровень также может не резервировать место для неиспользуемых переменных. Еще более высокий уровень может определять инструкции или функции, которые не служат никакой цели, и устранять их.

Обычно удаление мертвого кода используется как альтернатива дополнительному включению кода через препроцессор . Рассмотрим следующий код.