Это хороший вопрос. ARC - это гораздо больше, чем просто реализация умных указателей. Он также отличается от сборки мусора тем, что делает полным контролем над памятью.
В ARC вы точно знаете, когда объекты будут выпущены. Причина, по которой люди думают, что это неправда, в том, что вы не пишете явный вызов "release". Но вы знаете, когда компилятор вставит один. И это не на каком-то этапе сбора мусора, это встроенный, когда объекты больше не нужны.
Содержит шаг компилятора, который анализирует код и пытается найти любые избыточные последовательности увеличивающихся и уменьшающихся счетчиков ссылок. Вероятно, этого можно добиться с помощью оптимизирующего компилятора C ++, если ему будет предоставлена интеллектуальная реализация указателя, через которую его оптимизатор сможет видеть.
ARC также опирается на семантику цели c. Во-первых, указатели снабжены комментариями, чтобы сказать, являются ли они сильными или слабыми. Это также можно сделать в C ++, просто имея два разных класса указателей (или используя умные и ванильные указатели). Во-вторых, он полагается на соглашения об именах для объективных методов c, чтобы знать, должны ли их возвращаемые значения быть неявно слабыми или сильными, что означает, что он может работать вместе с не-ARC-кодом (ARC должен знать, предназначен ли ваш не-ARC-код для возврата объекта). например, с количеством ссылок +1). Если ваш "C ARC" не находится рядом с кодом, отличным от "C ARC", вам это не понадобится.
Последнее, что дает вам ARC, это действительно хороший анализ вашего кода, чтобы сказать, где, по его мнению, могут быть утечки во время компиляции. Это было бы трудно добавить в код C ++, но его можно добавить в компилятор C ++.