2008-09-18 5 views

ответ

28

Спецификация класса хранения управляет хранением и ссылкой ваших переменных. Это два разных понятия. C указывает следующие спецификаторы для переменных: auto, extern, register, static.

хранения
Продолжительность хранения определяет, как долго ваша переменная будет жить в памяти.
Существует три типа хранения: статические, автоматические и динамические.

статический
Если переменная объявлена ​​в области видимости файла, или с экстерном или статическим спецификатором, он будет иметь статическую память. Переменная будет существовать до тех пор, пока выполняется программа. Для создания этих переменных не затрачивается время выполнения.

автоматические
Если переменная объявлена ​​в функции, но без экстерном или статический спецификатора, он имеет автоматическое хранение. Переменная будет существовать только во время выполнения функции. Как только вы вернетесь, переменная больше не существует. Автоматическое хранение обычно выполняется в стеке. Это очень быстрая операция для создания этих переменных (просто увеличивайте указатель стека на размер).

динамический
Если вы используете таНос (или новый в C++) вы используете динамическое хранение. Это хранилище будет существовать до тех пор, пока вы не позвоните бесплатно (или удалите). Это самый дорогой способ создания хранилища, поскольку система должна управлять динамическим распределением и освобождением памяти.

Рычажного
Рычажные определяет, кто может видеть и ссылаться на переменном. Существует три типа связей: внутренняя связь, внешняя связь и отсутствие связи.

no linkage
Эта переменная видна только там, где она была объявлена. Обычно применяется к переменным, объявленным в функции.

внутренняя связь
Эта переменная будет видна всем функциям внутри файла (называемого translation unit), но и другие файлы не будут знать, что существует.

внешняя связь
Переменная будет видна другим единицам перевода. Их часто называют «глобальными переменными».

Ниже приведена таблица с описанием характеристик хранения и сцепления на основе спецификаторов

 
    Storage Class Function   File 
    Specifier  Scope    Scope 
----------------------------------------------------- 
    none   automatic   static  
       no linkage  external linkage 

extern   static   static 
       external linkage external linkage 

static   static   static 
       no linkage  internal linkage 

    auto   automatic   invalid 
       no linkage 

register   automatic   invalid 
       no linkage 
+1

Возможно, необходимо добавить дополнительную детализацию на единицы перевода, поскольку они не просто файлы ... они являются исходными файлами и любыми заголовками, включенными в них (хотя и косвенно). – workmad3 2008-09-18 19:21:05

+1

Wow ... +1. Обратите внимание, что «auto» изменит свой смысл на C++ 0x: http://en.wikipedia.org/wiki/C%2B%2B0x – paercebal 2008-09-18 19:49:20

0

Переменные классы хранения или спецификаторов типа (например, летучего, авто и статический) определяют, как/где переменные сохраняются во время выполнения программы. Например, переменные, определенные в функциях, обычно сохраняются в стеке, что означает, что они будут потеряны после возвращения функции. Используя ключевое слово «static», вы можете заставить компилятор помещать переменную в сегмент данных в памяти, делая содержимое переменных постоянным между вызовами этой функции. Ключевое слово «register» заставит компилятор максимально стараться поместить переменную в регистр CPU, полезную для счетчиков в циклах и т. Д. Однако не гарантируется, что он фактически находится в регистре в конце концов.

Подробнее о спецификаторах типов here.

Смежные вопросы