Да, компилятор 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 - это спецификация языка.
1. Нет. Я понимаю, что .NET использует некий C++-подобный гибридный язык. – juanchopanza
Итак, основываясь на вашем комментарии, можем ли мы сказать, что другие языки программирования, поддерживаемые платформой .NET Framework, фактически используют некоторые гибридные языки для подключения к инфраструктуре? – fahrettinpercin
Нет, он может использовать языки, предназначенные для использования с каркасом, которые поддерживают GC как неотъемлемую часть языка. – juanchopanza