Динамическая память в С++ Было бы прекрасно, если бы программист мог писать программы, совсем не заботясь о памяти. Более того, в идеале программист и не должен ничего знать о том, где размещаются переменные программы. Но, к сожалению (или к счастью), мы живем в реальном мире и работаем на реальных компьютерах, объем памяти которых ограничен. И хотя некоторые языки программирования пытаются скрыть от программиста факт наличия памяти, имитируя неограниченный ее объем, на практике обычно оказывается, что не учитывать конечность памяти просто нельзя — это плохо сказывается на «здоровье» программы.
Память и объекты
С++ по отношению к памяти «поступает» значительно «честнее»: уже на странице 4 стандарта описывается «модель памяти С++ (см. п. 1.7 в [1]). Согласно этой модели, основной единицей памяти в С++ является байт. Память, доступная программе, состоит из последовательности байтов. Каждый байт имеет уникальный адрес и состоит из последовательности битов. Однако стандарт не утверждает, что байт обязательно содержит 8 бит — напротив, количество битов в байте является особенностью реализации. Тем не менее одно требование к байту прописано явно: байт должен быть такого размера, чтобы в нем был способен поместиться любой символ из базового набора символов.
Соответственно (см. п. п. 5.3.3 в [1]), операция si zeof () выдает размер объекта или типа в байтах, а результат выполнения операций sizeof(char), sizeof(signed char) и sizeof (unsigned char) равен 1. Размеры остальных встроенных типов зависят от реализации.
1 Например, С#, Java, Lisp, Prolog.
Каждый объект С++ является «областью памяти» (см. п. 1.8 в [1]). Объект обладает рядом свойств, например имеет имя и тип. Объекту приписывается
(см. п. 3.7 в [1]) период хранения в памяти (storage duration). Это свойство определяет и время жизни объекта, и тип памяти, в которой хранится объект (см. п. 3.8 в [1]). Различают три периода хранения и в соответствии с этим — три класса памяти, в которой размещаются объекты:
? статическая память;
? автоматическая память;
? динамическая память.
В статической памяти размещаются все глобальные объекты, объявленные вне каких-либо функций, и классов, а также любые статически переменные, в том числе объявленные в функциях и классах. Память для этих объектов выделяется в момент запуска программы, а уничтожаются такие объекты только при завершении программы.
В автоматической памяти размещаются локальные нестатические объекты, которые объявляются в любом блоке, в том числе в теле любой функции. В частности, переменные, объявленные в теле главной функции, тоже являются локальными. Память таким объектам выделяется в момент объявления, а уничтожаются они при выходе из области видимости. Естественно, наиболее подходящей реализацией является размещение локальных объектов в стековой памяти (хотя в стандарте об этом нет ни слова).
Работая программистом в какой либо фирме так часто хочется себя чем то побаловать, например мороженным - мороженица kenwood идеально подойдет для приготовления мороженного.
В стандарте (см. п. 12.5 в [1]) динамическая память называется «свободной». Динамическая память выделяется объектам во время выполнения программы с помощью специальных операций new и new[] (см. п. п. 5.3.4 в [1]). Возврат динамической памяти (и уничтожение объектов при этом) тоже выполняется специальными операциями delete и delete [] (см. п. п. 5.3.5 в [1]). В стандарте работа с динамической памятью описывается в разных местах (см. п. п. 3.7.3, 5.3.4, 5.3.5, 12.5, 17.4.3.4, 18.4, 20.4 в [1]), поэтому составить целостную картину непросто.
Опубликовал Kest
September 25 2013 19:11:34 ·
0 Комментариев ·
5241 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.