Другие языки программирования и технологии

C++ Объясните пож. на доступном языке про спецификаторы класса памяти. В инете и в книгах слишком заумно. Продолж ниже.

1) В каких случаях целесообразнее объявлять переменные и функции со спецификаторами auto register extern static? Особенно не понятно когда лучше static а когда auto!
2) Переменная объявлена как register. Если инициализируется указатель на переменную в то время, когда её значение находится в регистрах, то как тогда вычисляется её адрес? (по моему адрес можно вычислить только из оперативной памяти, а не из регистров процессора) . Поправьте меня, если я не прав.
1)
авто - только если тип можно получить при инициализации
регистр - мальнькая, часто используемая переменная
экстерн - ранее определенная переменная
статик - если значение переменной не должно теряться при выходе из блока кода

2)
честно хз. По моему компилятор просто проигнорирует оператор регистр и поместит переменную в ОЗУ.

Чет маилру не дает английские буквы писать)))
НА
Нуржан Акашов
25 952
Лучший ответ
Класс памяти – это время, в течении которого переменная существует в памяти компьютера.
Помогают компилятору, указывая в какую память стоит помещать данную переменную, для улучшения эффективности программы
.
Они используются для того чтобы указывать область видимости и действия переменных, а также того, будут ли они динамическими (будет ли их адрес меняться в процессе выполнения программы) .
К динамическим относятся auto и register.

• auto. Этот спецификатор автоматического класса памяти указывает на то, что объект располагает-ся в локальной (или автоматически распределяемой) памяти. Он используется в операторах объявле-ния в теле функций, а также внутри блоков операторов. Объекты, имена которых объявляются со спецификатором auto, размещаются в локальной памяти непосредственно перед началом выполнения функции или блока операторов. При выходе из блока или при возвращении из функции (о механизмах вызова функций и возвращения из них речь ещё впереди) , соответствующая область локальной памяти освобождается и все ранее размещённые в ней объекты уничтожаются. Таким образом спецификатор влияет на время жизни объекта (это время локально) . Спецификатор auto используется редко, поскольку все объекты, определяемые непосредственно в теле функции или в блоке операторов и так по умолчанию располагаются в локальной памяти. Вне блоков и функций этот специфика-тор не используется.

• register. Ещё один спецификатор автоматического класса памяти. Применяется к объектам, по умолчанию располагаемым в локальной памяти. Представляет из себя "ненавязчивую просьбу" к транслятору (если это возможно) о размещении значений объектов, объявленных со спецификатором register в одном из доступных регистров, а не в локальной памяти. Если по какой-либо причине в мо-мент начала выполнения кода в данном блоке операторов регистры оказываются занятыми, трансля-тор обеспечивает с этими объектами обращение, как с объектами класса auto. Очевидно, что в этом случае объект располагается в локальной области памяти.
К статическим относятся static и extern.

• static. Спецификатор внутреннего статического класса памяти. Применяется только (!) к именам объектов и функций. В C++ этот спецификатор имеет два значения. Первое означает, что определяе-мый объект располагается по фиксированному адресу. Тем самым обеспечивается существование объекта с момента его определения до конца выполнения программы. Второе значение означает ло-кальность. Объявленный со спецификатором static локален в одном программном модуле (то есть, недоступен из других модулей многомодульной программы) или в классе (о классах - позже) . Может использоваться в объявлениях вне блоков и функций. Также используется в объявлениях, располо-женных в теле функций и в блоках операторов.

• extern. Спецификатор внешнего статического класса памяти. Обеспечивает существование объекта с момента его определения до конца выполнения программы. Объект, объявленный со спецификато-ром extern доступен во всех модулях программы, то есть глобален.

Транслятор определяет класс памяти автоматически.
Регистр -Указывает что переменная будет использоваться как счетчик, такую переменную будет удобно использовать в циклах и подобым образом.
Никишин Павел
Никишин Павел
1 892