Можно ли ввести автоматический подсчет ссылок (ARC) для C ++? - PullRequest
21 голосов
/ 16 марта 2012

Цель C представила технологию ARC, которая освобождает разработчика от бремени управления памятью.Звучит здорово, я думаю, что разработчики на C ++ были бы очень рады, если бы g ++ также имел эту функцию.

ARC позволяет вам возложить бремя управления памятью на компилятор (Apple LLVM 3.0) и никогда не думатьо сохранении, выпуске и автоматическом выпуске когда-либо снова

Так что, если LLVM3.0 может сделать это, я думаю, что g ++ также может освободить разработчиков C ++ от сложных задач управления памятью, верно?* Есть ли какие-либо трудности с введением ARC в C ++?

Что я имею в виду: если мы не используем умные указатели, мы просто используем new / new[], возможно ли компилятору сделатьчто-то для нас, чтобы предотвратить утечки памяти?Например, автоматически заменить новый на смарт-указатель?

Ответы [ 9 ]

21 голосов
/ 16 марта 2012

C ++ имеет концепцию Распределение ресурсов - Инициализация (RAII) и интеллектуальное использование этого метода избавляет вас от явного управления ресурсами.

C ++ уже предоставляет shared_ptr, который обеспечивает подсчет ссылок.

Кроме того, существует множество других интеллектуальных указателей , которые используют RAII для облегчения вашей жизни в C ++.

17 голосов
/ 09 августа 2013

Это хороший вопрос. ARC - это гораздо больше, чем просто реализация умных указателей. Он также отличается от сборки мусора тем, что делает полным контролем над памятью.

В ARC вы точно знаете, когда объекты будут выпущены. Причина, по которой люди думают, что это неправда, в том, что вы не пишете явный вызов "release". Но вы знаете, когда компилятор вставит один. И это не на каком-то этапе сбора мусора, это встроенный, когда объекты больше не нужны.

Содержит шаг компилятора, который анализирует код и пытается найти любые избыточные последовательности увеличивающихся и уменьшающихся счетчиков ссылок. Вероятно, этого можно добиться с помощью оптимизирующего компилятора C ++, если ему будет предоставлена ​​интеллектуальная реализация указателя, через которую его оптимизатор сможет видеть.

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

Последнее, что дает вам ARC, это действительно хороший анализ вашего кода, чтобы сказать, где, по его мнению, могут быть утечки во время компиляции. Это было бы трудно добавить в код C ++, но его можно добавить в компилятор C ++.

8 голосов
/ 16 марта 2012

Там нет необходимости. Мы поделились указателями, которые делают это для нас. Фактически, у нас есть ряд типов указателей для множества различных обстоятельств, но общие указатели имитируют именно то, что делает ARC.

См:

станд :: shared_ptr <>

повышение :: shared_ptr <>

3 голосов
/ 13 января 2014

Недавно я написал некоторый код Objective-C ++ с использованием Clang и с удивлением обнаружил, что указатели Objective-C фактически обрабатывались как не-POD-типы в C ++, которые я мог бы без проблем использовать в своих классах C ++. Они фактически были автоматически освобождены в моих деструкторах!
Я использовал это для хранения слабых ссылок в std :: vectors, потому что не мог придумать, как хранить NSArrary слабых ссылок ..
В любом случае, мне кажется, что Clang реализует ARC в Objective-C, эмулируя C ++ RAII и умные указатели в Objective-C. Когда вы думаете об этом, каждый NSObject * в ARC является просто умным указателем (intrusive_ptr из Boost) в C ++.
Единственное отличие, которое я вижу между ARC и умными указателями, состоит в том, что ARC встроен в язык. Они имеют ту же семантику, кроме этого.

3 голосов
/ 16 марта 2012

В чем преимущество использования ARC вместо полной сборки мусора?Перед комитетом было конкретное предложение по сбору мусора;в конце концов, это не было решено из-за нехватки времени, но, похоже, большинство комитета (если не совсем консенсус) высказались за добавление сборки мусора в C ++.

Глобально, ссылкаподсчет является плохой заменой для истинной сборки мусора: это дорого с точки зрения времени выполнения и требует специального кода для обработки циклов.Однако он применим в определенных ограниченных случаях, и C ++ предлагает его через std::shared_ptr, по просьбе программиста, когда он знает, что это применимо.

3 голосов
/ 16 марта 2012

Одной из причин использования C ++ является полный контроль над управлением памятью . Если вы не хотите этого в конкретной ситуации, есть умные указатели, которые сделают управление за вас.

Решения для управляемой памяти существуют, но в ситуации, когда C ++ выбран правильно (для крупномасштабных больших приложений), это нереально.

2 голосов
/ 16 марта 2012
  1. Уже есть несколько реализаций подобных технологий для C ++; например, сборщик мусора Boehm-Demers-Weiser .
  2. C ++ 11 имеет специальный двоичный интерфейс приложения для всех, кто хочет добавить свою собственную сборку мусора.
  3. В подавляющем большинстве случаев такие методы, как умные указатели , могут выполнять задачу безболезненного управления памятью для разработчиков на C ++.
2 голосов
/ 16 марта 2012

Посмотрите Qt. Qt реализовал эту функцию, используя цепочку иерархии. Вы можете создать новый указатель и назначить ему родителя, Qt поможет вам управлять памятью.

0 голосов
/ 10 февраля 2017

В Microsoft C ++ / CX есть ARC для ref-классов.Embarcadero имеет 2 компилятора C ++, один из них имеет ARC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...