是的,MSVC++ 编译器允许您编写可以使用垃圾收集器的 C++ 代码。必须使用 /clr 编译选项来启用正确的代码生成。
但是你必须做更多,任何垃圾收集器都需要做的一件重要的事情是发现存储在堆栈或 CPU 寄存器上的对象指针。这是一件很难做到的事情,像 Boehm 这样实用的 C++ 垃圾收集器是保守的收集器。.NET 收集器不是,它要求运行时可以发现所有指针。
这需要对传统的 C++ 构建模型和语言语法进行大量更改。最重要的是,C++ 编译器将代码转换为 IL 而不是机器代码。该中间语言在运行时被即时编译为机器代码。抖动执行的一项非常重要的工作是它在运行时构建一个表,告诉收集器对象存储在哪里,为 GC 提供了一种可靠的方法来发现堆栈帧槽或 CPU 寄存器中的指针。这几乎是完全不可见的,除了不生成经过高度优化的代码的副作用。很好地支持将编译为 IL 的代码与直接编译为机器代码的代码混合使用。
您必须告诉编译器哪些指针存储对垃圾收集对象的引用并不是那么不可见。您仍然使用ptr*
普通指针的语法,但必须使用ptr^
托管指针的语法。而且,像 Boehms 一样,您必须使用不同的分配器,使用关键字gcnew
而不是new
关键字。对象引用同样不同,您使用ref%
而不是ref&
. 还有另一种类型的数组,你必须使用array<>
关键字来获得一个可以被 GC 可靠地检查指针的数组。作为托管类的类必须用 the 来声明,ref class
而不是class
关键词。还有一个附加扩展包,允许使用 .NET 特定功能,例如属性、事件和委托。
这些 C++ 语法扩展称为 C++/CLI。Ecma-372 是语言规范。