14 Классы памяти в с++.

Существует 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 должно использоваться.

 

Hosted by uCoz