200 Глава 3
Обычно данные в версии программы на машинном языке, загружаются для расчетов и другой обработки в регистры.
Совет по повышению эффективности 3.2
Спецификация класса памяти register может быть помещена перед объявлением автоматической переменной, чтобы компилятор сохранял переменную не в памяти, а в одном из высокоскоростных аппаратных регистров компьютера. Если интенсивно используемые переменные, такие как счетчики или суммы могут сохраняться в аппаратных регистрах, накладные расходы на повторную загрузку переменных из памяти в регистр и обратную загрузку результата в память могут быть исключены.
Типичная ошибка программирования 3.15
Использование нескольких спецификаций класса памяти для одного идентификатора. Для идентификатора может быть указана только одна спецификация класса памяти. Например, если вы указали register, нельзя указать также и auto.
Компилятор может проигнорировать объявления register. Например, может оказаться недостаточным количество регистров, доступных компилятору для использования. Приведенное ниже объявление определяет, что целая переменная counter должна быть помещена в один из регистров компьютера; независимо от того, сделает это компилятор или нет, counter получит начальное значение 1:
register int counter = 1;
Ключевое слово register может применяться только к локальным переменным и параметрам функций.
Совет no повышению эффективности 3.3
Часто объявления register не являются необходимыми. Современные оптимизирующие компиляторы способны распознавать часто используемые переменные и решать, помещать их в регистры или нет, не требуя от программиста объявления register.
Ключевые слова extern и static используются, чтобы объявить идентификаторы переменных и функций как идентификаторы статического класса памяти с глобальным временем жизни. Такие переменные существуют с момента начала выполнения программы. Для таких переменных память выделяется и инициализируется сразу после начала выполнения программы. Имена функций тоже существуют с самого начала выполнения программы. Однако это не означает, что эти идентификаторы могут быть использованы по всей программе. Как будет видно из раздела 3.11, класс памяти и область действия (где можно использовать имя) — это разные вещи.
Существует два типа идентификаторов статического класса памяти: внешние идентификаторы (такие, как глобальные переменные и имена функций), и локальные переменные, объявленные спецификацией класса памяти static. Глобальные переменные и имена функций по умолчанию относятся к классу памяти extern. Глобальные переменные создаются путем размещения их объявлений вне описания какой-либо функции. Глобальные переменные сохраняют свои значения в течение всего времени выполнения программы. На глобальные переменные и функции может ссылаться любая функция, которая расположена после их объявления или описания в файле.
Функции 201
Замечание по технике программирования 3.12
Объявление переменной глобальной, а не локальной, приводит к неожиданным побочным эффектам, когда функции, не нуждающиеся в доступе к этой переменной, случайно или намеренно изменяют ее. Вообще лучше избегать использования глобальных переменных за исключением особых случаев, когда требуется уникальная производительность (это будет рассмотрено в главе 18).
Хороший стиль программирования 3.11
Переменные, используемые только в отдельной функции, предпочтительнее объявлять как локальные переменные этой функции, а не как глобальные переменные.
Локальные переменные, объявленные с ключевым словом static, известны только в той функции, в которой они определены, но в отличие от автоматических переменных локальные переменные static сохраняют свои значения в течение всего времени существования функции. При каждом следующем вызове функции локальные переменные содержат те значения, которые они имели при предыдущем вызове. Следующий оператор объявляет локальную переменную count как static и присваивает начальное значение 1
static int count = 1;
Все числовые переменные статического класса памяти принимают нулевые начальные значения, если программист явно не указал другие начальные значения. (Статические переменные — указатели, обсуждаемые в главе 5, тоже имеют нулевые начальные значения).
Спецификации класса памяти extern и static имеют специальное значение, когда они применяются явно к внешним идентификаторам. В главе 18, «Другие темы», мы обсудим явное использование extern и static с внешними идентификаторами и программами с множеством исходных файлов.
- 116 Глава 2
- 2.13. Основы повторения, управляемого счетчиком
- 2.14. Структура повторения for (цикл)
- 120 Глава 2
- 122 Глава 2
- 2.15. Пример использования структуры for
- 124 Глава 2
- 126 Глава 2
- 2.16. Структура множественного выбора switch
- Глава 2
- 130 Глава 2
- 132 Глава 2
- 2.17. Структура повторения do/while
- 134 Глава 2
- 2.18. Операторы break и continue
- Глава 2
- 2.19. Логические операции
- 138 Глава 2
- Глава 2
- 2.21. Заключение по структурному программированию
- IfcrpyKTypa (единственный выбор)
- Глава 2
- Глава 2
- 148 Глава 2
- Глава 2
- Глава 2
- Глава 2
- 156 Глава 2
- 158 Глава 2
- 160 Глава 2
- 2.1. А) следование, выбор и повторение, b) if/else. С) управляемым счет чиком или определенным заранее, d) Метку, сигнал, флаг или лож ный сигнал.
- 162 Глава 2
- 164 Глава 2
- 166 Глава 2
- 168 Глава 2
- 170 Глава 2
- 172 Глава 2
- 174 Глава 2
- 176 Глава 2
- 178 Глава 3
- Глава 3
- 3.3. Математические библиотечные функции
- 3.4. Функции
- Глава 3
- 3.5 Определения функций
- 184 Глава 3
- 186 ГлаваЗ
- 3.6. Прототипы функций
- 188 Глава 3
- 3.7. Заголовочные файлы
- 3.8. Генерация случайных чисел
- Глава 3
- 192 Глава 3
- 194 Глава 3
- 3.9. Пример: азартная игра
- Глава 3
- 198 Глава 3
- 3.10. Классы памяти
- 200 Глава 3
- 3.11. Правила, определяющие область действия
- 202 Глава 3
- 204 Глава 3
- 3.12 Рекурсия
- Глава 3
- 6) Значения, возвращаемые после каждого рекурсивного вызова
- 3.13. Пример использования рекурсии: последовательность чисел Фибоначчи
- Глава 3
- 3.14. Рекурсии или итерации
- 212 Глава 3
- Глава 3
- Глава 4
- Глава 5
- Глава 6
- 3.15. Функции с пустыми списками параметров
- 214 Глава 3
- 3.16. Встраиваемые функции