Читать «Полный справочник по С++» онлайн - страница 24

Герберт Шилдт

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

В языке C++ эта особенность модификатора static сохраняется, но объявлена нежелательной. Это означает, что при разработке новых программ использовать это свойство не рекомендуется. Вместо него следует применять пространства имен, описанные в части //.

Спецификатор register

Спецификатор register изначально применялся лишь к переменным типа int, char или указателям. Однако впоследствии его толкование было расширено, и теперь его можно применять к переменным любого типа.

Спецификатор register был разработан для того, чтобы компилятор сохранял значение переменной в регистре центрального процессора, а не памяти, как обычно. Это означает, что операции над регистровыми переменными выполняются намного быстрее.

В настоящее время смысл спецификатора register трактуется очень широко. В стандарте языка С утверждается, что “доступ к объекту следует максимально ускорить”. (В стандарте языка C++ говорится, что спецификатор register — это “подсказка компилятору, что данный объект используется очень интенсивно”.) На практике в регистрах центрального процессора сохраняются символы и целые числа. Более крупные объекты наподобие массивов, очевидно, там не поместятся, но они сохраняют возможность приоритетной обработки компилятором. В зависимости от реализации компилятора и операционной системы обработка регистровой переменной осуществляется по-разному. С технической точки зрения компилятор может просто игнорировать спецификатор register и обрабатывать переменную как обычно, но на практике это случается редко

Спецификатор register можно применять только к локальным переменным и формальным параметрам. • К глобальным переменным он не применяется. В рассмотренном ниже примере функция вычисляет значение Мс для целых чисел.

int int_pwr(register int m, register int e)

{

register int temp;

temp = 1;

for(; e; e--) temp = temp * m;

return temp;

}

В данном примере переменные е, ш и temp объявлены как регистровые, поскольку они используются внутри циклов. Тот факт, что регистровые переменные оптимизированы по скорости, делает их идеально подходящими для использования в циклах. Обычно регистровые переменные применяются там, где к одной и той же переменной происходит очень много обрашений. Это очень важно, поскольку регистровыми можно объявить сколько угодно переменных, но не все они будут обеспечивать одинаковую скорость доступа.

Количество регистровых переменных в каждом блоке оптимизируется по скорости и зависит как от операционной системы, так и от реализации языка C/C++. Беспокоиться

о количестве регистровых переменных не стоит, поскольку компилятор автоматически преобразовывает “лишние” регистровые переменные в обычные. (Это обеспечивает машинонезависимость программ в рамках довольно широкого спектра процессоров.)