1

我从来没有用 C++ 编程,但是当我用 C# 编码时,我想了解更多关于 .NET Framework 的信息。.NET Framework 基本上是一个库和运行时环境。那部分被覆盖了。但是,如果 .NET Framework 支持多种语言,例如 C++、VB.NET、J#,那么为 C# 提供的功能应该与其他语言相同。

因此,如果 C++ 是 .NET Framework 支持的语言,那么它应该具有垃圾回收功能。这也应该是 .NET Framework 支持的其他语言。

我应该在两个问题中收集主题:

1- C++ 有垃圾收集吗?2- .NET Framework 支持的每种编程语言是否都具有 .NET Framework 的所有功能?

4

3 回答 3

2

1) 托管 C++ 对托管资源使用 .NET 垃圾收集。

还要检查这个线程

于 2013-08-31T08:33:25.743 回答
1

是的,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 是语言规范。

于 2013-08-31T11:03:24.253 回答
0

C++ 本身没有垃圾收集。
托管 C++ 和较新的 C++/CLI 确实具有垃圾收集,因为它是 .Net 的一部分。
并非所有其他 .Net 语言都支持每种 .Net 语言中的所有内容。有一种共同语言:

“要与用任何语言编写的其他对象进行完全交互,对象必须仅向调用者公开所有语言共有的那些特性。这组通用特性由公共语言规范 (CLS) 定义,这是一组规则,适用于生成的程序集。”

取自文档。(“任何语言”是指任何 .Net 语言。)

例如,唯一符合 CLS 的无符号整数类型是byte.

于 2013-08-31T08:54:24.050 回答