Справочник по C/C++
Спецификаторы классов памяти

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

extern

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

auto

Спецификатор auto уведомляет компилятор о том, что локальная переменная, перед именем которой он стоит, создаётся при входе в блок и разрушается при выходе из блока. Все переменные, определённые внутри функции, являются автоматическими по умолчанию, и по этому ключевое слово auto используется крайне редко.

register

Когда язык C был только изобретён, спецификатор register можно было использовать лишь для локальных целых и ли символьных переменных, поскольку он заставлял компилятор пытаться сохранить эту переменную в регистре центрального процессора вместо того, чтобы её просто разместить в памяти. В таком случае все ссылки на переменную работали исключительно быстро. С тех пор определение спецификатора расширилось. Теперь любую переменную можно определить как register и тем самым возложить заботу об оптимизации доступа к ней на компилятор. Для символов и целых это по прежнему означает их хранение в регистре процессора, но для других типов данных, это может означать, например, использование кэш-памяти.

Следует иметь в виду, что использование спецификатора register — это всего лишь заявка, которая может быть и не удовлетворена. Компилятор волен её проигнорировать. Причина этого состоит в том, что только ограниченное число переменных можно оптимизировать ради ускорения обработки данных. При превышении этого предела компилятор будет просто игнорировать дальнейшие register-"заявки".

static

Спецификатор static указывает компилятору на хранение локальной переменной во время всего жизненного цикла программы вместо ее создания и разрушения при каждом входе в область действия и выходе из неё. Следовательно, возведение локальных переменных в ранг статистических позволяет поддерживать их значения между вызовами функций.

Модификатор ststic можно также применять к глобальным переменным. В этом случае область видимости такой переменной ограничивается файлом, В котором она объявлена, это означает, что переменная будет иметь внутреннюю привязку. Внутренняя привязка говорит о том, что модификатор известен только внутри своего файла.

В языке C++ использование спецификатора ststic для данных-членов класса приводит к созданию только одной копии этих членов, совместно используемой всеми объектами класса.

mutable

Спецификатор mutable позволяет члену некоторого объекта переопределить свойство постоянства, т.е. атрибут const. Иначе говоря mutable-член const-объекта не является константным и может быть модифицирован.





2013-07-24 06:35:39 Александр

Привет! Объясни, если не сложно: не могу объявить элемент класса extern, чтобы его видели все обработчики событий в визуал студио. Например: в срр файле пишу: extern Ultra a; в файле Form1.h: обработчик1() { Ultra a; } обработчик2() { a.move(); } проект компилируется, но ругается линковщик.....




Оставить комментарий:
Ваше Имя:
Email:
Антибот:  
Ваш комментарий: