Главная arrow С++ (часть 4) arrow Простой сборщик мусора для С++

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

На протяжении всей истории развития компьютерных технологий велись дискуссии о способах управления динамически распределяемой памятью. Динамически распределяемая память (dynamically allocated memory) — это память, которую можно получить во время выполнения программы из хип-области (heap), являющейся частью свободной памяти, доступной для программного использования. Хип-область (heap) часто называют свободной памятью (free store) или динамической памятью (dynamic memory). Динамическое распределение очень важно, так как оно позволяет программе получать, применять, освобождать и потом повторно использовать память во время выполнения приложения. Поскольку почти все практические программы так или иначе используют динамическое распределение памяти, способ управления памятью существенно влияет на их структуру и производительность.
Обычно применяют два способа поддержки динамической памяти. Первый заключается в распределении вручную, при этом программист должен явно освобождать неиспользуемую память для ее повторного применения в дальнейшем. Второй базируется на автоматическом подходе, обычно называемом сбором мусора (garbage collection) и обеспечивающем автоматическую очистку освободившейся памяти. Достоинства и недостатки есть у обоих подходов, и в разное время предпочтение отдавалось то одному, то другому. В С++ принято управлять динамической памятью вручную. Сбор мусора применяется в языках Java и С#. Поскольку Java и С# — более молодые языки, можно считать, что современной тенденцией в разработке языков программирования отдается предпочтение сбору мусора. Но это не значит, что программист на С++ оставлен на "обочине истории". Благодаря богатым возможностям языка С++ можно легко создать программу-сборщик мусора для С++ и получить и синицу в руке, и журавля в небе, т. е. управлять динамическим распределением вручную, когда это необходимо, и собирать мусор, если захочется.
В этой главе разрабатывается полная подсистема сбора мусора для С++. Для начала важно понять, что сборщик мусора не заменяет встроенный в С++ подход к динамическому распределению памяти, а скорее дополняет его. Обе системы — распределение вручную и сбор мусора — могут применяться в одной программе.
Будучи образцом полезного (и одновременно выразительного) кода, сборщик мусора стал первым примером в этой книге, потому что он со всей очевидностью демонстрирует необыкновенные возможности языка С++. С помощью шаблонных классов, перегрузки операций и унаследованной С++ способности обрабатывать низкоуровневые элементы, которыми оперирует компьютер, такие как адреса памяти, можно легко добавить базовое средство в С++. В большинстве других языков изменение поддерживаемого способа динамического распределения потребовало бы исправлений в компиляторе. В языке же С++, благодаря огромным возможностям, предоставляемым программисту, эта задача решается на уровне исходного кода.
Сборщик мусора также продемонстрирует, как можно описать и полностью встроить в программную среду С++ новый тип данных. Такая расширяемость типов — ключевой компонент языка С++, который часто недооценивается. Наконец, сборщик мусора иллюстрирует способность С++ "подойти вплотную к машине", так как он манипулирует и управляет указателями. В отличие от некоторых других языков, запрещающих доступ к элементам низкого уровня, язык С++ позволяет программисту приблизиться к аппаратным средствам насколько это необходимо.