我一直是C#和.Net开发人员,并一直在玩学习c ++的想法.
我一直在考虑这个问题的一个主要原因是,使用.Net框架的应用程序可以比C++快多少.但我是否正确地假设如果我在Visual Studio中编写C++应用程序,和/或在C++应用程序中引用.Net库,C++在MSIL中转换(就像C#一样) - 因此我放弃了任何好处来自编码吗?
所以我的问题是这样的:应用程序的C++组件是引用.Net程序集以"传统"方式编译,还是编译成MSIL?
嗯,这比那复杂一点.实际上有两个完全不同版本的.NET支持C++.
旧版的C++ Managed Extensions是Visual C++ 2002/2003中唯一可用的选项.它可以在选项/ clr:oldSyntax下的较新编译器中使用.它有点笨拙,因为它努力与标准C++集成,所以所有新关键字(以及其中很多)都以双下划线为前缀等.此编译器生成的代码是本机和MSIL代码的混合,被称为IJW"it只是工作".
新的称为C++/CLI,是Visual C++ 2005及更高版本中提供的一种干净的新语言.最重要的是,它支持几种代码生成模式./ clr选项再次生成本机和MSIL代码的IJW混合./ clr:pure导致仅托管程序集,尽管它可以将本机类型转换为相应的.net结构.因此,代码可能不是类型安全的,可以使用指针算法,非常类似于C#with/unsafe.最严格的选项是/ clr:safe,它产生类型安全,可验证的MSIL-only程序集,与C#编译器完全一样(没有/不安全,即).
有关MC++和C++/CLI之间的差异,请参阅维基百科.
有关编译器开关的说明,请参阅MSDN.
PS..NET字节代码称为MSIL(Microsoft中间语言)或CIL(通用中间语言).MIL可以代表媒体集成层,这是WPF和Vista桌面窗口管理器使用的未记录的低级库.
保持概念分离可能是个好主意.
首先,C++是一种语言,它没有指定应该针对哪个平台的任何内容.原则上,直接C++代码可以编译为本机x86汇编程序,Java字节码,MSIL或您需要考虑的任何其他内容.我相信Adobe最近制作了一个生成Flash字节码的C++编译器.
其次,凭借典型的优柔寡断,微软已经创建了两种针对.NET的C++派生语言.首先,他们制作了"C++的托管扩展".然后他们决定吮吸,抛弃它并试图假装它从未存在过.
现在,他们对.NET风格的C++最好的选择叫做C++/CLI,但它不是C++.它以多种非标准方式扩展和改变语言.(我相信C++标准委员会要求他们更改名称以避免混淆.但他们没有)
Visual Studio 2005和更高版本支持C++/CLI.(在"添加项目"中,它们列在Visual C++ - > CLR下)
但是(你不觉得那么简单,不是吗?),微软再次做到了.指定C++/CLI后,实际上是一个设计合理的C++与CLI集成的尝试,他们意识到几乎没有人使用它!事实证明,即使是C++程序员通常也喜欢在.NET工作时使用C#,而在本地C++工作时则更喜欢使用C#.
所以现在,他们专注于使原生 C++和.NET 之间的互操作更简单,更强大.但是,C++/CLI不太可能消失.它有效,在某些情况下它很有用.这不是他们原本希望的C++杀手.
Visual Studio(自永远以来)也支持本机C++应用程序,编译为x86机器代码,不受.NET的影响.它们列在Visual C++ - > Win32下的"添加项目"对话框中.
因此,如果您想学习C++,您有两种选择:学习C++/CLI,它将您限制为仅使用MS的语言,生成MSIL而不是本机机器代码,并且需要运行.NET,并且通常不会值得的麻烦,因为如果你打算采取.NET依赖无论如何,为什么不能在C#写?
或者学习正确的C++,它与.NET完全分离,不能直接引用.NET程序集.
关键的一点是它们是不同的语言.您可以编译为C++/CLI,这意味着编译器将允许您引用.NET程序集,并将生成MSIL代码,或者您编译为C++,在这种情况下.NET世界不存在.
最后,请注意谨慎.尽管我的上述措辞("适当的C++"和"没有受到.NET的污染"),但C++并不"更好".在许多情况下,它也不会更快.C++有可能更快,但它更多地依赖于程序员.
C#编译器几乎可以将任何东西变成合理有效的代码.另一方面,C++充满了陷阱,会使你的代码比同等的C#慢.
http://blogs.msdn.com/ricom/archive/2005/05/10/416151.aspx以及它引用的博客文章值得一读,对于那些用两种语言编写的类似代码的性能感到好奇.
只有一个领域C++应用程序将始终更快,并且这是在启动时..NET应用程序可能必须加载.NET框架和JIT MSIL代码,本机应用程序才刚刚启动.
但除此之外,假设C++会更快,可能是错误的.它可以,因为它给你更多的控制.但通常情况下,这只意味着编译器无法避免您在代码中创建的低效率.
这是管理的非托管VS C++一个相当不错的(如果日)讨论.
在坚果shell中,C++可以是托管(编译为MIL)或非托管(编译为本机代码).