C++ cli C++/CX和C++/CLI依赖项

C++ cli C++/CX和C++/CLI依赖项,c++-cli,c++-cx,C++ Cli,C++ Cx,从语法和编译过程视图来看,C++/CX和C++/CLI之间的关系是什么? 这并不是很全面。有人有更多的信息吗?(这个答案代表了我作为一名参与C++/CX实现的测试人员的个人经验,不应被理解为包含了其他人的意见。) 在内部,当Windows宣布他们正在构建Windows运行时,并且由权威决定DevDiv的主要目标之一是支持此API并提供到各种语言的有用投影时,成立了一个小型设计团队,以研究C++团队所面临的独特挑战和机遇。我成为了分配给这个特性的编译器测试人员之一,当时我们称之为“MoCOM”(现

从语法和编译过程视图来看,C++/CX和C++/CLI之间的关系是什么? 这并不是很全面。有人有更多的信息吗?

(这个答案代表了我作为一名参与C++/CX实现的测试人员的个人经验,不应被理解为包含了其他人的意见。)

在内部,当Windows宣布他们正在构建Windows运行时,并且由权威决定DevDiv的主要目标之一是支持此API并提供到各种语言的有用投影时,成立了一个小型设计团队,以研究C++团队所面临的独特挑战和机遇。我成为了分配给这个特性的编译器测试人员之一,当时我们称之为“MoCOM”(现代COM)。对于上下文,重要的是要指出,我不是语言设计团队的成员,但我知道一些设计的早期草稿

目前尚不清楚这一最终语言将采取何种形式,并且有许多不同的提案(其中一些提案的级别低于其他提案)。有一件事变得清晰:最终的目标是充分利用新的Windows运行时,同时开发一些与C++兼容的东西,在幕后,将是性能和完全原生的。开发这种新语言的时间也很短

WinRT的设计人员还认真研究了不同语言使用其运行时意味着什么,并认真考虑了.NET语言(尤其是C#)如何与运行时进行互操作。这意味着许多WinRT概念相当整齐地映射到现有的.NET概念上。(这两个运行时试图解决许多相同的问题,并提供类似的功能集,因此这并不完全令人惊讶。)

最后,这意味着C++的现有语法与WRET的概念相当接近,并且已经解决了许多更为哲学的挑战,如何用C++语法兼容(不同程度)来表示所有这些相同的概念。它还有一个优点,就是已经在编译器中实现了大量的现有测试。最后,intellisense团队当时正在努力实现C++/CLI intellisense,因此我们可以通过少量额外支出(至少与全新语法相比)获得C++/CX intellisense

然而,尽管语法相同,实际的代码生成却截然不同。在.NET中,运行时为您做了很多繁重的工作;该语言定义了表达式的类型和MSIL,但运行时执行了大量繁重的工作:类型布局、本机代码生成、垃圾收集等

举几个例子:

  • 在本机C++/CX世界中,^在概念上和语法上与C++/CLI^(它表示指向接口或类的指针)相似,但在实现中却截然不同。在C++/CLI中,您只告诉运行时它是某种类型的托管指针(MSIL中的a*),而运行时“做了魔术”,在C++/CX中,a^是智能指针,编译器需要在适当的时间(例如,当它超出范围时)插入addref和release
  • C++/CLI中的“gcnew”变成了一行简单的MSIL。C++/CX中的“ref new”需要确定适当的工厂,创建工厂的实例,然后要求工厂创建基础类的实例
  • 在C++/CLI中,您只需对类指针进行函数调用;在C++/CX中,如果您有类指针,则必须确定请求的函数实际所在的适当接口,即该接口的QI,然后根据QI的结果调用函数
这些差异很多,每个概念图都提出了独特的挑战。此外,我的示例都是关于使用WinRT类型的;让编译器也能够编写与WinRT兼容的类型是另一种蠕虫

所有这一切都表明:虽然C++/CLI和C++/CX的语法非常相似,但实际上实现是完全不同的。这是一项大量的工作,但设计团队也有意选择开发一种与WinRT概念兼容但不依赖.NET运行时的语言(因为它是不必要的,并且有理论上的性能优势)


如果您想了解更多关于幕后实际发生的事情,Deon Brewis,语言扩展的主要开发人员之一,在Build 2011上就实现的精髓做了一次非常深入的演讲。(我是键盘后面的人。)

认为他们有什么共同点没有多大帮助。语法看起来非常相似,因为它们都解决了相同的问题,与外部类型系统接口。