Существует
4 спецификатора класса памяти:
1)auto
2)register
3)static
4)extern
Если класс памяти не указан, он
определяется по умолчанию из контекста объявления.
Объекты классов auto и register имеют локальное время жизни.
Спецификаторы static и extern определяют объекты с глобальным
временем жизни, но точный смысл каждого спецификатора зависит от того,
находится ли он на внешнем или на внутреннем уровне и от того, является ли
объект функцией или переменной.
На
внутреннем уровне при объявлении переменной может быть использован любой из 4
спецификаторов класса памяти. Если спецификатор опущен, то подразумевается auto
fun()
{
int i; -> auto int i;
Переменная
с классом памяти auto имеет локальное время жизни. Она видима только в том блоке,
в котором объявлена. Память для этой переменной выделяется при входе в блок и
освобождается при выходе. При повторном входе в блок память для этой переменной
может быть распределена в другом месте.
register
Предписывает компилятор распределить
память под переменную в регистре процессора, если это возможно. Переменная с
классом памяти register имеет ту же область видимости, что и auto.
Когда компилятор встречает
спецификатор register, а свободного регистра не имеется, то для переменной распределяется
память auto.
Регистровая память, если она имеется,
может быть назначена только для переменной типа int и указателей.
static
Переменные, объявленные на внутреннем
уровне со спецификатором static, обеспечивают возможность сохранить значение локальной
переменной при выходе из блока и использовать его при следующем входе в блок.
fun()
{
static int counter=0;
…
counter++;
}
extern
Переменная, объявленная со
спецификатором extern, является ссылкой на переменную с тем же именем, определенную на внешнем
уровне в любом исходном файле программы.
Цель объявления extern состоит в
том, чтобы сделать объявление переменной внешнего уровня видимой внутри блока.
file1.cpp
fun1()
{
extern long
counter;
counter++}
file2.cpp
long counter
fun2()
{
…
}
Даже если определение внешней
переменной находится в том же файле, но позже, чем она используется, объявление
extern должно использоваться.