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