Сводная таблица
компилятор
действие | Microsoft Visual C++ 6 | Borland C++ 5 | WATCOM C 10 | ||||
размножение констант | всегда размножает | никогда не размножает | всегда размножает | ||||
свертка констант | всегда сворачивает | никогда не сворачивает | всегда сворачивает | ||||
вычисление константных выражений | вычисляет | вычисляет | вычисляет | ||||
свертка функций | никогда не сворачивает | никогда не сворачивает | никогда не сворачивает | ||||
удаление неиспользуемых переменных | удаляет с все неявно неиспользуемые отслеживанием генетических связей | удаляет лишь явно неиспользуемые переменные. генетические связи не отслеживает | удаляет с все неявно неиспользуемые отслеживанием генетических связей | ||||
удаление неиспользуемых присвоений | удаляет | удаляет | удаляет | ||||
удаление копий переменных | удаляет | не удаляет | удаляет | ||||
удаление лишних присвоение | удаляет | не удаляет | удаляет | ||||
удаление лишних вызовов функций | не удаляет | не удаляет | не удаляет | ||||
выполнение алгебраических упрощений | частично | не выполняет | не выполняет | ||||
оптимизация подвыражений | вычислят идентичные выражения (с учетом перегруппировки) лишь раз | частично оптимизирует без учета перегруппировки | вычислят идентичные выражения (с учетом перегруппировки) лишь раз | ||||
замена деления сдвигом | заменяет | заменяет | заменяет | ||||
замена деления умножением | заменяет | не заменяет | не заменяет | ||||
замена оператора взятия остатка битовыми операциями | заменяет | заменяет | заменяет | ||||
быстрое вычисление остатка | не поддерживает | не поддерживает | не поддерживает | ||||
замена умножения сдвигом | заменяет | заменяет | заменяет | ||||
замена умножения сложением | заменяет | заменяет | не заменяет | ||||
использование LEA для быстрого сложения (умножения, вычитания) | использует | использует | использует | ||||
замена условных переходов арифметическими операциями | не заменяет | не заменяет | не заменяет | ||||
удаление лишних условий | удаляет | не удаляет | не удаляет | ||||
удаление заведомо ложных условий | частично | не удаляет | не удаляет | ||||
балансировка дерева case-переходов | балансирует | балансирует | не балансирует | ||||
создание таблицы переходов | создает | создает | частично | ||||
разворот циклов | не разворачивает | не разворачивает | не разворачивает | ||||
слияние циклов | не сливает | не сливает | не сливает | ||||
вынос инвариантного кода за пределы цикла | выносит | не выносит | выносит | ||||
замена циклов с предусловием на циклы с постусловием | заменяет | не заменяет | не заменяет | ||||
замена возрастающих циклов на убывающие циклы | заменяет | не заменяет | не заменяет | ||||
удаление ветвлений из цикла | удаляет | не удаляет | не удаляет | ||||
учет частоты использования переменных при помещении их в регистр | не учитывает | учитывает | учитывает | ||||
передача аргументов в регистрах по умолчанию | нет | да | да | ||||
количество регистров, выделенных для передачи аргументов функции | 2 | 3 | 4 | ||||
адресация локальных переменных через ESP | да | да | да | ||||
оптимизация инициализации константных строк | да | нет | нет | ||||
удаление "мертвого" кода | да | нет | частично | ||||
оптимизация константных условий | да | нет | да |
Таблица 1 Поддержка основных методов оптимизации компиляторами Microsoft Visual C++, Borland C++ и WATCOM C++. Серым цветом для облегчения ориентации закрашены не поддерживаемые пункты