Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lections_rus.doc
Скачиваний:
31
Добавлен:
06.02.2016
Размер:
1.41 Mб
Скачать

13.2.2. Несколько слов о заголовочных файлах

Заголовочный файл предоставляет место для всех extern-объявлений объектов, объявлений функций и определений встроенных функций. Это называется локализацией объявлений. Те исходные файлы, где объект или функция определяется или используется, должны включать заголовочный файл.

Такие файлы позволяют добиться двух целей. Во-первых, гарантируется, что все исходные файлы содержат одно и то же объявление для глобального объекта или функции. Во-вторых, при необходимости изменить объявление это изменение делается в одном месте, что исключает возможность забыть внести правку в какой-то из исходных файлов. Пример с addToken() имеет следующий заголовочный файл:

// ----- token.h -----

typedef unsigned char uchar;

const uchar INLINE = 128;

// ...

const uchar IT = ...;

const uchar GT = ...;

extern uchar lastTok; extern int addToken( uchar ); inline bool is_relational( uchar tok ) { return (tok >= LT && tok <= GT); }

// ----- lex.C ----- #include "token.h" // ...

// ----- token.C ----- #include "token.h" // ...

Упражнение 13.3

Установите, какие из приведенных ниже инструкций являются объявлениями, а какие – определениями, и почему:

(a) extern int ix = 1024;

(b) int iy;

(c) extern void reset( void *p ) { /* ... */ }

(d) extern const int *pi;

(e) void print( const matrix & );

Упражнение 13.4

Какие из приведенных ниже объявлений и определений вы поместили бы в заголовочный файл? В исходный файл? Почему?

(a) int var;

(b) inline bool is_equal( const SmallInt &, const SmallInt & ){ }

(c) void putValues( int *arr, int size );

(d) const double pi = 3.1416;

(e) extern int total = 255;

13.3. Локальные объекты

Объявление переменной в локальной области видимости вводит локальный объект. Существует три вида таких объектов: автоматические, регистровые и статические,различающиеся временем жизни и характеристиками занимаемой памяти.Автоматический объектсуществует с момента активизации функции, в которой он определен, до выхода из нее.Регистровый объект– это автоматический объект, для которого поддерживается быстрое считывание и запись его значения.Локальный статический объектрасполагается в области памяти, существующей на протяжении всего времени выполнения программы. В этом разделе мы рассмотрим свойства всех этих объектов.

13.3.1. Автоматические объекты

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

13.3.2. Регистровые автоматические объекты

Автоматические объекты, интенсивно используемые в функции,можно объявить с ключевым словом register, тогда компилятор будет их загружать вмашинные регистры.Если же это невозможно, объекты останутся в основной памяти.Индексы массивов и указатели, встречающиеся в циклах, – хорошие кандидаты в регистровые объекты.

for ( register int ix =0; ix < sz; ++-ix ) // ...

for ( register int *p = array ; p < arraySize; ++p ) // ...

Параметры функций также можно объявлять как регистровые переменные:

bool find( register int *pm, int Val ) {

while ( *pm )

if ( *pm++ == Val ) return true;

return false;

}

Их активное использование может заметно увеличить скорость выполнения функции.

Указание ключевого слова register – только подсказка компилятору. Некоторые компиляторы игнорируют такой запрос, применяя специальные алгоритмы для определения наиболее подходящих кандидатов на размещение в свободных регистрах.

Поскольку компилятор учитывает архитектуру машины, на которой будет выполняться программа, он зачастую может принять более обоснованное решение об использовании машинных регистров.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]