Спецификаторы хранения

Перед модификатором и типом могут быть указаны следующие спецификаторы:

  • register — является подсказкой компилятору, что переменная будет использоваться интенсивно. Для ускорения доступа, значение такой переменной сохраняется в регистрах процессора. Компилятор может проигнорировать это объявление и сохранить значение в памяти. Ключевое слово может использоваться при объявлении переменной внутри блока или в параметрах функции. К глобальным переменным не применяется. Пример объявления переменной:
register int x = 20;
  • extern — сообщает компилятору, что переменная определена в другом месте, например, в другом файле. Ключевое слово лишь объявляет переменную, а не определяет ее. Таким образом, память под переменную повторно не выделяется. Если при объявлении производится инициализация переменной, то объявление становится определением переменной. В качестве примера объявим переменную внутри функции main(), а определение переменной разместим после функции:
#include <iostream>
 
int main() {
   extern int x; // Определение в другом месте
   std::cout << x << std::endl; // 10
   return 0;
}
int x = 10; // Определение переменной x
  • static — если ключевое слово указано перед локальной переменной, то значение будет сохраняться между вызовами функции. Инициализация статических локальных переменных производится только при первом вызове функции. При последующих вызовах используется сохраненное ранее значение. Создадим функцию со статической переменной. Внутри функции увеличим значение переменной на единицу, а затем выведем значение в окно консоли. Далее вызовем эту функцию несколько раз:
#include <iostream>
 
void func();
 
int main() {
   func(); // 1
   func(); // 2
   func(); // 3
   return 0;
}
void func() {
   static int x = 0;     // Статическая переменная
   ++x;                  // Увеличиваем значение на 1
   std::cout << x << std::endl;
}

При каждом вызове функции func() значение статической переменной x будет увеличиваться на единицу. Если убрать ключевое слово static, то при каждом вызове будет выводиться число 1, так как локальные переменные инициализируются при входе в функцию и уничтожаются при выходе из нее.

Если ключевое слово static указано перед глобальной переменной, то ее значение будет видимо только в пределах файла. Вместо статических глобальных переменных лучше использовать неименованные пространства имен.

На заметку

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов