Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> Язык C

Классы хранения в C: область видимости, время жизни и производительность

Классы хранения в C

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

Автоматические (локальные) переменные

Переменные, объявленные внутри блока, являются автоматическими (также — локальными). Они существуют только внутри этого блока и уничтожаются при его завершении.

#include <stdio.h>
int main(void) {
    for (int i = 0; i < 5; ++i) {
        printf("C programming\n");
    }
    // Ошибка: i не объявлена в этой области видимости
    printf("%d", i);
    return 0;
}

Запуск даёт ошибку undeclared identifier i, так как i объявлена только внутри блока for.

int main() {
    int n1; // локальна для main()
}
void func() {
    int n2; // локальна для func()
}

Здесь n1 недоступна внутри func(), а n2 — внутри main().

Глобальные (внешние) переменные

Переменные, объявленные вне всех функций, — глобальные (внешние). Доступны из любой функции в той же единице трансляции. Когда глобальная переменная определена в одном файле, но используется в другом, ключевое слово extern сигнализирует, что определение находится в другом месте.

Пример: Глобальная переменная

#include <stdio.h>
void display();
int n = 5; // глобальная переменная
int main() {
    ++n;
    display();
    return 0;
}
void display() {
    ++n;
    printf("n = %d\n", n);
}

Вывод

n = 7

Если n определена в file1.c и используется в file2.c, добавьте extern int n; в начало file2.c для избежания ошибки компиляции.

Регистровые переменные

Ключевое слово register подсказывает компилятору хранить переменную в регистре процессора для ускорения доступа. Современные компиляторы агрессивно оптимизируют, часто делая подсказку ненужной. Используйте register только когда профилирование показывает критический узкое место на встраиваемых системах.

Статические переменные

Статические переменные объявляются с static и сохраняют значение на протяжении всего выполнения программы. Инициализируются только один раз при старте программы и существуют до её завершения.

Пример: Статическая переменная

#include <stdio.h>
void display();
int main() {
    display();
    display();
}
void display() {
    static int c = 1;
    c += 5;
    printf("%d ", c);
}

Вывод

6 11

При первом вызове c инициализируется 1, затем увеличивается до 6. При втором — сохраняет 6, увеличивается до 11 и печатается.

В файловой области видимости объявление static даёт переменной внутреннее связывание (internal linkage), делая её невидимой для других единиц трансляции — полезная особенность для инкапсуляции.

Согласно стандарту ISO C, поведение static гарантирует единственный экземпляр во всех вызовах функции, что критично для стейтфул операций без глобального загрязнения.

Сводная таблица классов хранения

Класс храненияКлючевое словоОбласть видимостиВремя жизниПамятьЗначение по умолчанию
Автоматическийauto (неявно)БлокДо конца блокаСтекНеинициализировано (мусор)
РегистровыйregisterБлокДо конца блокаРегистр CPU (или стек)Неинициализировано
Статический (локальный)staticБлокВся программаСегмент данных (BSS/Data)0 (нуль)
Внешний (глобальный)externФайл/программаВся программаСегмент данных0 (нуль)
Статический (глобальный)staticФайл (internal linkage)Вся программаСегмент данных0 (нуль)

Best Practices

Язык C

  1. Мастерство C# переменных и примитивных типов данных: полное руководство
  2. Область видимости переменных в C#: класс, метод и блок
  3. Ключевое слово static в C#: статические переменные, методы и классы
  4. Шаблоны классов в C++: практическое руководство
  5. Переменные, константы и литералы в C: полное руководство
  6. Переменные и типы данных в C++: подробное руководство по int, double, char, string, bool
  7. Типы переменных в Java: локальные, экземпляра и статические
  8. Переменные в C: объявление, определение, инициализация, область видимости и классы хранения
  9. Классы хранения в C: auto, register, static, extern — область видимости и время жизни
  10. Правила области видимости в C: локальные, глобальные и формальные переменные