Что такое спецификатор связи и хранилища переменной? - PullRequest
10 голосов
/ 18 сентября 2008

Когда кто-то говорит о спецификаторе класса хранения переменных, о чем он говорит?
Они также часто говорят о переменной связи в том же контексте, что это?

Ответы [ 2 ]

31 голосов
/ 18 сентября 2008

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

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

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

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

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

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

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

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

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

Вот таблица, описывающая характеристики хранения и связи на основе спецификаторов

  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
0 голосов
/ 18 сентября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...