Почнемо з постулювання, що пам'ять на сьогоднішній день (десятки, сотні чи навіть тисячі разів) частіше, ніж усі інші ресурси разом. Кожна окрема змінна, об’єкт, член об'єкта потребує виділеної йому пам'яті та звільненої пізніше. Для кожного відкритого файлу ви створюєте десятки до мільйонів об'єктів для зберігання даних, витягнутих з файлу. Кожен потік TCP поєднується з необмеженою кількістю тимчасових байтових рядків, створених для запису в потік. Ми тут на одній сторінці? Чудово.
Щоб RAII працював (навіть якщо у вас є готові розумні покажчики для кожного випадку використання під сонцем), вам потрібно отримати право власності . Вам потрібно проаналізувати, хто повинен володіти тим чи іншим об’єктом, хто не повинен, і коли право власності має бути передано з А на Б. Зрозуміло, ви можете використовувати спільну власність на все , але тоді ви будете емулювати GC за допомогою розумних покажчиків. З цього моменту стає набагато простіше та швидше побудувати GC на мові.
Збір сміття звільняє вас від турботи про далеко не найчастіше використовуваний ресурс, пам’ять. Звичайно, все ж потрібно прийняти те саме рішення для інших ресурсів, але вони набагато рідше (див. Вище), і складні (наприклад, спільне) володіння також рідше. Психічне навантаження значно знижується.
Тепер ви називаєте деякі недоліки у тому, щоб усі цінності збирали сміття. Однак інтегрувати як безпечний для пам'яті GC, так і типи значень з RAII в одну мову вкрай складно, тож, можливо, краще змінити ці компроміси іншими способами?
Втрата детермінізму виявляється не такою поганою на практиці, оскільки впливає лише на детермінований термін експлуатації об'єкта . Як описано в наступному параграфі, більшість ресурсів (окрім пам’яті, яка є достатньою і може бути ліниво перероблена), не пов'язана з усіма ресурсами цих мов. Є кілька інших випадків використання, але вони є рідкісними в моєму досвіді.
Ваш другий пункт, ручне управління ресурсами, сьогодні вирішується за допомогою заяви, яка виконує очищення, засноване на масштабах, але не прив'язує це очищення до часу життя об'єкта (отже, не взаємодіючи з GC та безпекою пам'яті). Це using
в C #, with
в Python, try
-з ресурсами в останніх версіях Java.