Сборка мусора в основном означает, что ваши выделенные объекты автоматически освобождаются в какой-то момент после того, как они больше не доступны.
Точнее, они освобождаются, когда становятся недоступными для программы, так как иначе объекты с круговой ссылкой никогда не будут освобождены.
Умные указатели просто ссылаются на любую структуру, которая ведет себя как обычный указатель, но имеет некоторые дополнительные функциональные возможности. Они включают, но не ограничиваются освобождением, но также копирование при записи, связанные проверки, ...
Теперь, как вы заявили, умные указатели могут использоваться для реализации формы сборки мусора.
Но ход мыслей идет следующим образом:
- Сборка мусора - это круто, так как это удобно, и мне нужно заботиться о меньшем количестве вещей
- Поэтому: я хочу сборку мусора на моем языке
- Теперь, как можно получить GC на моем языке?
Конечно, вы можете создать его с самого начала. C # был разработан для сбора мусора, поэтому просто new
ваш объект, и он будет освобожден, когда ссылки выпадают из области видимости. Как это сделать, зависит от компилятора.
Но в C ++ сборка мусора не предназначалась. Если мы выделяем некоторый указатель, int* p = new int;
и он выходит из области видимости, p
сам удаляется из стека, но никто не заботится о выделенной памяти.
Теперь единственное, что у вас есть с самого начала - это детерминированные деструкторы . Когда объект покидает область, в которой он был создан, вызывается его деструктор. В сочетании с шаблонами и перегрузкой операторов вы можете создать объект-оболочку, который ведет себя как указатель, но использует функциональность деструктора для очистки ресурсов, подключенных к нему (RAII). Вы называете это умным указателем .
Все это в высшей степени специфично для C ++: перегрузка операторов, шаблоны, деструкторы, ... В этой конкретной языковой ситуации вы разработали умные указатели, чтобы предоставить вам необходимый GC.
Но если вы разрабатываете язык с помощью GC с самого начала, это всего лишь деталь реализации. Вы просто говорите, что объект будет очищен, и компилятор сделает это за вас.
Интеллектуальные указатели, такие как в C ++, вероятно, были бы невозможны даже в таких языках, как C #, которые вообще не имеют детерминированного уничтожения (C # обходит это, предоставляя синтаксический сахар для вызова a .Dispose()
для определенных объектов). Ресурсы, на которые нет ссылок, в конечном итоге будут возвращены GC, но когда именно это произойдет, он не определит.
А это, в свою очередь, может позволить GC выполнять свою работу более эффективно. Будучи встроенным в язык глубже, чем интеллектуальные указатели, которые установлены поверх него, .NET GC может, например, задерживать операции с памятью и выполнять их в блоках, чтобы сделать их более дешевыми, или даже перемещать память для повышения эффективности в зависимости от того, как часто объекты Доступ