Подтвердить что ты не робот

Можно ли ввести автоматический подсчет ссылок (ARC) на С++?

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

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

Итак, если LLVM3.0 может это сделать, я думаю, что g++ также может освобождать разработчиков С++ от жестких задач управления памятью, правильно?

Есть ли какие-либо трудности для внедрения ARC в С++?

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

4b9b3361

Ответ 1

С++ имеет понятие Инициализация ресурсов (RAII), и интеллектуальное использование этого метода сэкономит вам от явного управления ресурсами.

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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

См:

std:: shared_ptr < >

boost:: shared_ptr < >

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

Ответ 8

Ответ 9

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