【发布时间】:2010-10-25 17:46:03
【问题描述】:
例如,当查看 GlowCode 分析器网站时,它会说:
“GlowCode 6.2 和 x64 配置本机、托管和混合 C++、C#、.NET 代码”
它们是什么意思?
【问题讨论】:
例如,当查看 GlowCode 分析器网站时,它会说:
“GlowCode 6.2 和 x64 配置本机、托管和混合 C++、C#、.NET 代码”
它们是什么意思?
【问题讨论】:
本机代码是内存不是“托管”的代码,例如,内存没有为您释放(例如 C++ 的删除和 C 的释放),没有引用计数,没有垃圾收集。您猜对了,托管代码是内存空闲并为您分配、垃圾收集和其他好东西的代码。
混合代码是指您拥有调用非托管层的托管代码。通常,当您有一个纯非托管 C++ DLL 并使用 P/invoke 从 .NET 调用它时。
【讨论】:
/clr 编译并输出为 MSIL)在本机堆上分配本机对象(无垃圾回收)。此外,(桌面).NET 垃圾收集器不使用引用计数(存在循环问题)。
本机代码被编译为直接与操作系统一起使用。然而,托管代码是预编译的(Java 中的字节码),然后由即时编译器在运行时处理为本机代码。托管代码有一个有趣的副作用,即有可能在不同的操作系统上运行,因为机器代码在虚拟机实际使用它之前不会创建。这样,您可以在 Windows 上运行 .NET 应用程序,也可以在安装了 Mono 运行时的 Linux 或 Mac 上运行它们。可移植性目前不像 Java 那样干净(因为微软的自然封闭架构),但这个概念仍然存在。
如果您运行的是非托管应用,则代码已编译为针对指定的操作系统/硬件运行。到另一个操作系统/指令集的任何可移植性都会丢失,必须重新编译才能执行。
【讨论】:
本机代码以运行它的计算机的“本机”机器语言编写,并由处理器直接执行。
托管代码是用一种特殊的语言编写的,需要另一个程序来运行(即管理)它。这个其他程序通常被称为解释器,因为它解释特殊语言。
C 和 C++ 程序是原生的。
Java 和 C#(以及与此相关的所有 .NET 语言)都受到管理。
托管 C++ 是在 .NET 解释器中运行的一种特殊形式的 C++。
混合程序是使用本地代码和托管代码的程序。
【讨论】:
在公共语言运行时 (CLR) 控制下运行的代码称为托管代码。不在 CLR 下运行的代码称为本机代码。
【讨论】: