Збір сміття в основному означає лише те, що виділені об’єкти автоматично вивільняються в якийсь момент після того, як вони вже не будуть доступні.
Точніше, вони випускаються, коли стають недоступними для програми, оскільки об'єкти, що мають циркулярний посилання, ніколи не будуть звільнені в іншому випадку.
Інтелектуальні покажчики просто посилаються на будь-яку структуру, яка поводиться як звичайний покажчик, але має додаткову функціональність. Сюди входять, але не обмежуються ними, лише розмежування, а також копіювання, запис, прив'язка чеків,
Тепер, як ви вже заявляли, розумні покажчики можна використовувати для впровадження форми збору сміття.
Але потяг думки йде наступним шляхом:
- Збір сміття - це класна річ, як це зручно, і я повинен подбати про меншу кількість речей
- Тому: я хочу збирання сміття моєю мовою
- Тепер, як можна отримати GC моєю мовою?
Звичайно, ви можете спроектувати його так із самого початку. C # був розроблений так, щоб збирати сміття, тому просто new
ваш об’єкт і він буде випущений, коли посилання випадуть із сфери застосування. Як це зробити, залежить від компілятора.
Але в С ++ не було призначено збирання сміття. Якщо ми виділимо якийсь вказівник, int* p = new int;
і він не виходить за межі, p
він видаляється зі стека, але ніхто не піклується про виділену пам'ять.
Тепер єдине, що ви маєте з самого початку - це детерміновані деструктори . Коли об'єкт залишає сферу, в якій він був створений, викликається його деструктор. У поєднанні з шаблонами та перевантаженням оператора ви можете розробити об’єкт обгортки, який веде себе як вказівник, але використовує функцію деструктора для очищення доданих до нього ресурсів (RAII). Ви називаєте цього розумним вказівником .
Це все специфічно для C ++: перевантаження операторів, шаблони, деструктори ... У цій конкретній мовній ситуації ви розробили розумні покажчики, щоб надати вам потрібний GC.
Але якщо ви розробляєте мову з GC з самого початку, це лише деталь реалізації. Ви просто скажете, що об'єкт буде очищений, і компілятор зробить це за вас.
Розумні покажчики, як у C ++, ймовірно, не можуть бути навіть можливими на таких мовах, як C #, які взагалі не мають детермінованого знищення (C # працює навколо цього, надаючи синтаксичний цукор для виклику .Dispose()
на певні об'єкти). Нереференційовані ресурси, нарешті, будуть повернені GC, але не визначено, коли саме це відбудеться.
А це, в свою чергу, може дозволити ГК зробити свою роботу більш ефективно. Будучи вбудованим у мову глибше, ніж розумні покажчики, встановлені на ньому, .NET GC може, наприклад, затримувати операції з пам’яттю та виконувати їх у блоках, щоб здешевити або навіть перемістити пам’ять для підвищення ефективності залежно від частоти об'єктів доступ до них.