你好。这是 吉姆·斯普林菲尔德 是Visual C++团队的架构师。
今天,我想对官方称为 C++/CX ,它是为支持Windows8中的新API模型而设计的 //建造/ ,观看 一些在线课程 ,或一直在玩 visualstudio的预发行版 ,您可能已经看到了一些“new”语法。对于熟悉C++和CLI的人来说( i、 e.我们为CLR提供的语言扩展 ),语法应该没什么不同。
但是请注意,虽然C++ /CX语法与C++ + CLI非常相似,但底层实现非常不同,它不使用CLR或垃圾收集器,它生成完全本地代码(X64、X64、ARM,取决于目标)。
在windows8支持的早期设计中,我们研究了许多不同的想法,包括纯库方法以及在语言中集成支持的各种方法。在VisualC++团队中支持COM有着悠久的历史。从MFC到ATL到 #导入 归于ATL。我们也有一个很好的经验,在目标CLR包括原始托管扩展,C++ + CLI,和IJW支持编译本地代码到MSIL。我们的设计团队由7人组成,其中包括从事这些工作的人员,他们在库、编译器实现和语言设计方面有丰富的经验。
我们实际上为Windows 8开发了一个新的C++模板库,称为WRL( Windows运行时库 )它确实支持不带语言扩展的windows8。WRL是非常好的,看看它,看看所有的底层细节是如何实现的,这是很有启发性的。许多Windows团队都在内部使用它,尽管它与ATL在支持classic COM时遇到了许多相同的问题。
- 编写组件仍然非常困难。你必须知道很多关于接口的低级规则。
- 您需要一个单独的工具(MIDL)来编写接口/类型。
- 无法自动将接口从低级映射到引发异常并具有实际返回值的高级(现代)表单。
- 创作模式和消费模式并不统一。
随着Windows运行时中的一些新概念的出现,这些缺点变得比经典的COM/ATL更加困难。接口继承不像经典COM那样基于vtable。类继承基于一种类似于聚合的机制,但有一些区别,包括对私有接口和受保护接口的支持。我们很快意识到,尽管需要像WRL这样的低级工具,但对于绝大多数应用来说,它太难使用了,我们可以在保持性能和提供大量控制的同时做得更好。
这个 #导入 特征 VC6中提供的方法为使用具有类型库的COM对象提供了一种很好的机制。我们考虑过为Windows运行时提供类似的东西(它使用了一个新的.winmd文件),但是虽然这可以提供一个良好的使用体验,但它对创作没有任何帮助。考虑到Windows正在转向一个许多东西都是异步的模型,回调的编写是非常重要的,并且没有多少消费场景不包括至少一些编写。另外,编写对于编写UI应用程序非常重要,因为每个页面和用户定义的控件都是从现有运行时类派生的类。
设计团队花了很多时间讨论Windows运行时组件的使用情况。我们很早就决定应该在比ABI定义的更高的级别上公开类和接口。支持诸如异常等现代C++特性被认为是重要的,并且将继承的运行时定义(既用于接口和类)映射到C++,也就是说,它是自然的。很快我们就清楚了,我们需要一些新的类型来表示这些,因为我们不能改变现有的C++ ABI的含义。我们用了很多不同的名字,直到我们决定用 ^ 我们也决定使用 托管类 指示Windows运行时类的创作。
我们还花了大量的时间研究了各种方法来保持指向WinRT类或接口的指针。这个决定的一部分也是如何区分接口的低级版本和高级版本之间的区别。我们有很多不同的建议,包括使用 * ,使用 * 使用修饰符,并使用各种其他字符,例如’ @ ‘符号。在最初的托管代码扩展中,我们实际上使用了 * 用修饰语( __总承包商 ). 我们意识到,如果我们沿着这条路走,我们会遇到许多同样的问题。当我们开始思考指针解引用的类型时,一些突破就出现了。这使我们意识到我们所做的与我们设计C++时的做法类似。有一次,有人建议 为什么我们不直接用 ^ 符号? “笑声平息后,开始变得很有意义。在设计点之后,我们经常会遇到我们为C++/CLI所做的相同的设计决定。
我们试图表达的许多概念已经出现在C++/CLI语法中。鉴于引用计数是垃圾收集的一种形式,使用 ^ 代表一个 重新计数 “ZW中的指针非常适合。解引用 ^ 产生 %% ,也像C++ +CLI。虽然许多概念都是用同样的方式表达的,但我们有一些领域决定偏离C++/CLI。例如,在C++/CX中,类的默认接口通过接口列表中的属性指定,而C++ C++中的属性是类本身的属性。
在C++中,我们在使用与正则类型互操作的引用类型时,比C++ +CLI有一个更好的故事。在C++/CLI中,托管对象可以在垃圾回收器运行时在内存中移动。这意味着您无法获得成员的真实地址(没有固定),甚至无法嵌入除基元类型(即。 内景 )进入你的课堂。你也不能把 ^ 变成本地人 班 或 结构 . 在C++/CX中,对象不会在内存中移动,因此所有这些限制都消失了。可以将任何类型放入ref类,也可以将 ^ 任何地方。该模型对普通C++类更为友好,在C++/CX中给程序员带来了更多的灵活性。
我们将提供更多的洞察我们的设计在未来几个月。如果您想了解更多的具体情况,请告知我们。