Программирование >>  Формирование пользовательского контейнера 

1 2 [ 3 ] 4 5 6 ... 156


ляемой языком С++, а не обилием несуразностей и противоречий. Более того, благодаря элегантности своей структуры объектная модель С++ послужила образцом, позже использованным в языках Java и С#.

Наследие С++

Предложенный Денисом Риччи (Dennis Ritchie) в 70-х годах прошлого века, язык С положил начало радикальным изменениям в программировании. Хотя некоторые более ранние языки, особенно Pascal, добились значительных успехов, язык С стал образцом, повлиявшим на целое поколение языков программирования. Именно с языка С началась современная эра профаммирования.

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

Спроектированный Бьярном Страуструпом (Bjarne Stroustrup) язык С++ был создан на базе С. Страуструп добавил ключевые слова и синтаксис, необходимые для объектно-ориентированного профаммирования. Включив поддержку ООП в уже ставший к тому времени популярным язык С, Страуструп дал возможность тысячам профаммистов осваивать новые идеи объектно-ориентированного профаммирования. С появлением С++ новая эра в области профаммирования достигла вершины развития. Одним мастерским штрихом Страуструп создал самый мошный язык профаммирования и задал направление развития для будущих языков.

Хотя наследие С++ еше преумножается, оно ужр привело к созданию двух важных языков профаммирования: Java и С#. За исключением незначительных отличий, синтаксис, объектная модель и общие ощущение и взгляд языков Java и С# идентичны С++. Более того, библиотеки Java и С# воспроизводят модель библиотек С++, а механизмы обработки коллекций объектов в языках Java и С# унаследованы непосредственно из STL. Язык С++ - это выдающаяся разработка, основательно повлиявшая на современное профаммирование.

Мощные средства профаммирования, предложенные в реализации языка С++, превратили его в язык, которому отдают предпочтение профаммисты во всем мире. Максимальные функциональные возможности - наследие С++!



Глава 2

Простой сборщик мусора для С++

На протяжении всей истории развития компьютерных технологий велись дискуссии о способах управления динамически распределяемой памятью. Динамически распределяемая память (dynamically allocated memory) - это память которую можно получить во время выполнения программы из хип-области (heap), являющейся частью свободной памяти, доступной для профаммного использования. Хип-область (heap) часто называют свободной памятью (free store) или динамической памятью (dynamic memory). Динамическое распределение очень важно, так как оно позволяет профамме по- лучать, применять, освобождать и потом повторно использовать память во время выполнения приложения. Поскольку почти все практические профаммы так или иначе используют динамическое распределение памяти, способ управления памятью существенно влияет на их структуру и производительность.

Обычно применяют два способа поддержки динамической памяти. Первый заключается в распределении вручную, при этом профаммист должен явно освобождать неиспользуемую память для ее повторного применения в дальнейшем. Второй базируется на автоматическом подходе, обычно называемом сбором мусора (garbage collection) и обеспечивающем автоматическую очистку освободившейся памяти. Достоинства и недостатки есть у обоих подходов, и в разное время предпочтение отдавалось то одному, то другому. В С++ принято управлять динамической памятью вручную. Сбор мусора применяется в языках Java и С#. Поскольку Java и С# - более молодые языки, можно считать, что современной тенденцией в разработке языков профаммирования отдается предпочтение сбору мусора. Но это не значит, что профаммист на С++ оставлен на обочине истории . Благодаря богатым возможностям языка С++ можно легко создать профамму-сборщик мусора для С++ и получить и синицу в руке, и журавля в небе, т. е. управлять динамическим распределением вручную, когда это необходимо, и собирать мусор, если захочется.



В этой главе разрабатывается полная подсистема сбора мусора для С++. Для начала важно понять, что сборщик мусора не заменяет встроенный в С++ подход к динамическому распределению памяти, а скорее дополняет его. Обе системы - распределение вручную и сбор мусора - могут применяться в одной программе.

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

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

Сравнение двух подходов к управлению памятью

Перед разработкой сборщика мусора для С++ полезно сравнить сбор мусора с методом распределения памяти вручную, встроенным в С++. Обычно использование динамической памяти в С++ - двухэтапный процесс. Сначала память выделяется из хип-области с помошью операции new. Затем, когда она больше не нужна, память освобождается с помошью операции delete. Таким образом, каждое динамическое распределение выполняется в следующей последовательности:

Р = new some object; II ... delete р;

Как правило, любое применение операции new должно быть уравновешено соответствующим вызовом операции delete. Если delete не применяется, то память не освобождается, даже если она уже не используется в профамме.



1 2 [ 3 ] 4 5 6 ... 156

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика