C++/CX和C++/CLI的依赖关系

3

认为它们有任何共同点并不是很有帮助。语法看起来非常相似,因为它们都解决了同样的问题,即与外部类型系统进行接口交互。 - Hans Passant
1个回答

5
(此答案代表我个人作为参与C++/CX实现的测试人员的经验,不应被解释为代表任何其他人的意见。)
在Windows宣布他们正在构建Windows Runtime时,决定由有权力的人支持该API并为各种语言提供有用的投影之一是DevDiv的主要目标之一,成立了一个小型设计团队来研究C++团队所面临的独特挑战和机遇。我成为了分配给这个功能的编译器测试人员之一,当时我们称之为“MoCOM”(现代COM)。为了获得背景信息,重要的是要指出,我不在语言设计团队中,但我知道一些早期设计的草稿。
尚不清楚这种最终语言将采取什么形式,并且有许多不同的提议(其中一些比其他提议更低级)。有一件事变得清晰:最终目标是充分利用新的Windows Runtime,同时开发出与C ++兼容且在幕后具有高性能和完全本地化的东西。开发这种新语言的时间也非常有限。
WinRT的设计者还深入研究了不同语言使用其运行时的含义,并强烈考虑了.NET语言(尤其是C#)与其运行时的互操作性。这意味着许多WinRT概念与现有.NET概念相当匹配。 (两个运行时试图解决许多相同的问题并提供类似的功能集,因此这不是完全令人惊讶的。)
最终,这意味着C ++ / CLI的现有语法相当接近WinRT的概念,并且已经在编译器中实现了大量现有测试的优点。最后,智能感知团队正在努力实现C ++ / CLI智能感知,因此我们可以以较小的额外费用(至少与全新语法相比)获得C ++ / CX智能感知。
但是,尽管语法相同,实际的代码生成却截然不同。在.NET中,运行时为您完成了很多繁重的工作;语言定义表达式的类型和MSIL,但运行时完成了很多繁重的工作:类型布局,本机代码生成,垃圾回收等。
一些例子:
在本机的C++ / CX世界中,“ ^ ”在概念上和语法上类似于C ++ / CLI“ ^ ”(它表示指向接口或类的指针),但在实现方面却非常不同。在C ++ / CLI中,您只需告诉运行时它是某种类型的托管指针(MSIL中的“ *”),而运行时会“施展魔法”,而在C++ / CX中,“^”是一个智能指针,在适当的时间(例如当它超出作用域时)编译器需要插入AddRefs和Releases。
在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上提供了有关实现细节的出色深入讲解: http://channel9.msdn.com/Events/Build/BUILD2011/TOOL-690C。(我是键盘后面的那个家伙。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接