Что такое спецификатор связи и хранилища переменной?

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

c++ c
10 голосов | спросил Benoit 18 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 18 Sep 2008 23:15:06 +0400 2008, 23:15:06

2 ответа


0

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

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

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

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

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

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

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

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

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

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

  Функциональный файл класса хранения
  Спецификатор Область применения
-------------------------------------------------- ---
  нет автоматического статического
                 нет связи внешняя связь

 внешняя статическая статическая
                 внешняя связь внешняя связь

 статический статический статический
                 нет связи внутренняя связь

  автоматический автоматический недействительный
                 нет связи

зарегистрировать автоматически недействительным
                 нет связи
ответил Benoit 18 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 18 Sep 2008 23:17:34 +0400 2008, 23:17:34
0

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

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

ответил jkramer 18 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 18 Sep 2008 23:26:05 +0400 2008, 23:26:05

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132