 то компилятор заменит МАХ на текстовые цифры 100 и скомпилирует оператор 
так, как будто вы ввели эти цифры в этом месте. 
    Некоторые эксперты по C++ утверждают, что легко сделать ошибку при 
использовании символьных констант, подобных МАХ. Сторонники объявления const 
скорее предложат вам следующее: 

    const int MAX = 100; 

    Цикл for останется таким же, а объявление МАХ истинной константой даст 
определенные преимущества. 

    •   Компилятор сможет выполнить проверку типов с МАХ более строго. C++ 
распознает, что константа МАХ имеет тип int, в то время как компилятор ничего 
не знает о типе текстового макроса МАХ. 

    •  Turbo Debugger распознает истинную константу МАХ. Отладчик не 
распознает символьные константы, созданные с помощью #define. 

    Все это необходимо иметь в виду. К несчастью, истинная константа МАХ 
нуждается в постоянном месте хранения в сегменте данных программы. 
Многочисленные программные константы могут занимать сотни тысяч байтов, 
расходуя тем самым память. Более того, использование таких значений может 
потребовать отнимающих время обращений к памяти. Обычно символьные константы 
используются как эффективные команды, загружающие значения прямо в регистры. 
    Истинные константы полезны в том случае, если они используются как 
переменные, значения которых в процессе выполнения программы не подлежат 
изменению. Конечно, их преимущества не настолько велики, чтобы совсем 
отказываться от #define. 

    Встраиваемые функции 

    Одной из печальных истин программирования на языках, подобных С и C++, 
является то, что на вызов функций расходуется время. Хотя вызов функции 
происходит быстрее, чем вы успеете глазом моргнуть, многочисленные вызовы 
могут ухудшить общее быстродействие программы. Полный отказ от функций — 
неприемлемое решение этой проблемы! Функции делают программу модульной и более 
легкой для поддержки. Без функций исключительно сложно, может быть, невозможно 
написать даже среднюю по размерам корректно работающую программу. 
    С другой стороны, разворачивание циклов и устранение многочисленных 
вызовов функций — стиль, сберегающий время и улучшающий общее быстродействие 
программы. Рассмотрим следующий гипотетический цикл for: 

    for (int i = 0;   i < MAX;   i++ ) { 
       AnyFunction(); 
    } 

   Если значение MAX слишком велико, многократные вызовы Any Function() могут занять 
достаточно много драгоценного времени вдобавок к общему времени выполнения программы. 
Предположим, AnyFunction() написана следующим образом: 

    void AnyFunction(void) { 
       cout « AnyValue « '\n';
       AnyValue++; 
    }

    Все это, конечно, предположительно, но один факт не вызывает сомнений: 
вставка тела AnyFunctionO непосредственно в цикл for ускорит выполнение программы: 

    for (int i = 0; i < MAX; i++) 
          cout « AnyValue « '\n'; 
          AnyValue++; 
    }

    Сбереженное время эквивалентно времени выполнения МАХ вызовов функции. Еще 
лучше полностью развернуть цикл, убрав оператор цикла for: 

    cout « AnyValue « '\n'; 
    AnyValue++; 
    cout « AnyValue « '\n'; 
    AnyValue++; 
    cout « AnyValue « '\n'; 
    AnyValue++; 


    288	Часть III. Программирование на ANSI C++ 
