2013-08-31 2 views
1

Я никогда не программировался на C++, но пока я кодирую на C#, я хотел узнать больше о .NET Framework. .NET Framework - это в основном библиотека и среда выполнения. Эта часть покрыта. Но если .NET Framework поддерживает несколько языков, таких как C++, VB.NET, J #, то возможности, предоставляемые для C#, должны быть одинаковыми для других.Сбор мусора в C++

Так что если C++ - это язык, поддерживаемый .NET Framework, тогда он должен иметь сборку мусора. Это также должно быть правдой другие языки, поддерживаемые .NET Framework.

Я должен собрать тему два вопроса:

1- делает C++ есть сбор мусора? 2- У всех языков программирования, поддерживаемых .NET Framework, есть все возможности .NET Framework?

+0

1. Нет. Я понимаю, что .NET использует некий C++-подобный гибридный язык. – juanchopanza

+0

Итак, основываясь на вашем комментарии, можем ли мы сказать, что другие языки программирования, поддерживаемые платформой .NET Framework, фактически используют некоторые гибридные языки для подключения к инфраструктуре? – fahrettinpercin

+0

Нет, он может использовать языки, предназначенные для использования с каркасом, которые поддерживают GC как неотъемлемую часть языка. – juanchopanza

ответ

2

1) Управляемый C++ использует сборку мусора .NET для управляемых ресурсов.

Также проверьте этот Thread

+0

Обратите внимание, что «управляемый C++» не является стандартным C++. – juanchopanza

+0

@juanchopanza: Да, полностью согласен !!!! –

+0

Управляется C++ и C++/CLI одинаковы? –

0

C++ по себе не имеет сбора мусора.
Управляемый C++, а также новый C++/CLI, имеет сбор мусора, поскольку он является частью .Net.
Не все на каждом языке .Net поддерживается всеми другими .Net langauge. Существует общего язык:.

«Для того, чтобы полностью взаимодействовать с другими объектами, написанных на любом языке, объекты должны подвергать звонящие только те функции, которые являются общими для всех языков Этого общего набор функций определяются по общей спецификации Language (CLS), которая представляет собой набор правил, которые применяются к сгенерированным сборкам ».

взято с the docs. («Любой язык» означает любой язык .Net).

Например, единственный целочисленный тип без знака, который соответствует CLS, равен byte.

1

Да, компилятор MSVC++ позволяет писать код на C++, который может использовать сборщик мусора. Параметр/clr компиляции должен использоваться для обеспечения правильной генерации кода.

Но вам нужно сделать больше, одну нетривиальную вещь, которую должен сделать любой сборщик мусора, - это найти указатели объектов, которые хранятся в стеках или регистры процессора. Это сложно сделать, практические сборщики мусора C++, такие как Boehm's, являются консервативными коллекционерами. У сборника .NET нет, он требует, чтобы среда выполнения обнаружила все указатели.

Это потребовало ряда изменений в традиционной модели построения и синтаксисе языка C++. Самое главное, что компилятор C++ переводит код в IL вместо машинного кода. Этот промежуточный язык вовремя компилируется во время выполнения для машинного кода. Очень важная работа, выполняемая дрожанием, заключается в том, что она создает таблицу во время выполнения, которая сообщает коллекционеру, где хранятся объекты, что дает GC надежный способ обнаружить указатель обратно в слоте фрейма стека или в регистре CPU. Это почти полностью невидимо, кроме побочного эффекта не генерации кода, который так сильно оптимизирован. Хорошо поддерживается код смешивания, который скомпилирован в IL с кодом, который скомпилирован для машинного кода.

Не так невидимо требование, чтобы вы сообщали компилятору, какие указатели хранят ссылку на собранный мусором объект. Вы по-прежнему используете синтаксис ptr* для обычных указателей, но для управляемых указателей вы должны использовать синтаксис ptr^. И, как и Boehms ', вам нужно использовать другой распределитель, используя gcnew вместо ключевого слова new. Ссылки на объекты также различны, вы используете ref% вместо ref&. И есть еще один аромат массивов, вы должны использовать ключевое слово array<>, чтобы получить массив, который может быть надежно проверен GC для указателей. Классы, которые являются управляемыми классами, должны быть объявлены с помощью ref class вместо ключевого слова class. И есть дополнительный пакет дополнительных расширений, которые позволяют использовать специальные функции .NET, такие как свойства, события и делегаты.

Эти расширения синтаксиса C++ называются C++/CLI. Ecma-372 - это спецификация языка.