= " «
|
sizeof(double)
|
«
|
cout
|
«
|
"sizeof(char) =
|
|
" «
|
sizeof(char)
|
«
|
endl;
|
cout
|
«
|
"sizeof pointers
|
to
|
fundamental
|
types
|
-"
|
« endl;
|
cout
|
«
|
"sizeof(pint) =
|
|
" «
|
sizeof(pint)
|
«
|
endl;
|
cout
|
«
|
"sizeof(pDouble)
|
= " «
|
sizeof(pDouble) «
|
endl;
|
cout
|
«
|
"sizeof(pChar)
|
=
|
" «
|
|
sizeof(pChar) «
|
endl;
|
return 0;
}
Результат
sizeof fundamental types -
sizeof (int) = 4
sizeof(double) = 8
sizeof(char) = 1
sizeof pointers to fundamental types -
sizeof(pint) = 4
sizeof(pDouble) = 4
sizeof(pChar) = 4
Анализ
Вывод однозначно демонстрирует, что даже при том, что s i z e o f (c h a r) составляет 1 5айт, a s i z e o f (d o u b le) — 8 байтов, размер их указателей всегда остается постоянным —
байта. Это связано с тем, что объем памяти, необходимый для хранения адреса, является тем же, независимо от того, указывает ли адрес на 1 байт или на 8 байтов.
Вывод листинга 8.6 свидетельствует, что размер указателей составляет 4 байта, но на вашей системе результат может быть иным. Вывод был получен при ком пиляции кода на 32-битовом компиляторе. Если вы используете 64-битовый компилятор и запустите программу на 64-битовой системе, то размер вашего указателя может составить 64 бита, т.е. 8 байтов.
Динамическое распределение памяти
Когда вы пишете программу, содержащее такое объявление массива, как
int Numbers[100]; // статический массив для 100 целых чисел
вашей программы есть две проблемы.
Так вы фактически ограничиваете емкость своей программы, поскольку она не смо жет хранить больше 100 чисел.
ЗАНЯТИЕ 8. Указатели и ссылки
Вы ухудшаете производительность системы в случае, когда храниться должно толь ко 1 число, а пространство все равно резервируется для 100 чисел.
Причиной этих проблем является статическое, фиксированное резервирование памяти для массива компилятором, как уже обсуждалось ранее.
Чтобы программа могла оптимально использовать ресурсы памяти, в зависимости от потребностей пользователя, необходимо использовать динамическое распределение па мяти. Это позволит при необходимости резервировать больше памяти и освобождать ее, когда необходимости в ней больше нет. Язык C++ предоставляет два оператора, new и d e l e te , позволяющие подробно контролировать использование памяти в вашем приложе нии. Указатели, являющиеся переменными, хранящими адреса памяти, играют критически важную роль в эффективном динамическом распределении памяти.
Использование операторов new и d e l e t e
для динамического резервирования и освобождения памяти
Оператор new используется для резервирования (распределения) новых блоков памяти. Чаще всего используется версия оператора new, возвращающая указатель на затребован ную область память в случае успеха, и передающая исключение в противном случае. При использовании оператора new необходимо указать тип данных, для которого резервирует ся память:
Тип* Указатель = new Тип; // запрос памяти для одного элемента
Вы можете также определить количество элементов, для которых хотите зарезервиро вать память (если нужно резервировать память для нескольких элементов):
Тип* Указатель = new Тип [КолЭлементов]; // запрос памяти для КолЭлементов
Таким образом, если необходимо разместить в памяти целые числа, используйте сле дующий код:
int* pNumber = new int;
int* pNumbers = new int[10];
// получить указатель на целое число
// получить указатель на блок из 10
// целых чисел
ПРИМЕЧАНИЕ Обратите внимание на то, что оператор new только запрашивает область па мяти. Нет никакой гарантии, что запрос всегда будет удовлетворен успешно, поскольку это зависит от состояния системы и доступности ресурсов памяти.
Каждая область памяти, зарезервированная оператором new, должна быть в конечном счете освобождена (очищена) соответствующим оператором d e l e te :
Тип* Указатель = new Тип;
delete Указатель; // освобождение памяти, зарезервированной
Do'stlaringiz bilan baham: |