VS2015 Update 1中的协同程序

[原文发表地址] Coroutines in Visual Studio 2015 – Update 1 [原文发表时间] 2015/11/30 8:51 AM   在 Visual Studio 2015的预览版本中,我们为C++引进了协同程序这个概念,你可以在这里和一些博客中看到相关介绍。也可以观看2015 CPPCon 上关于C++协同程序的讨论视频。 我们当前的工作重点仍然是Resumable功能,这篇文章只是简单更新一下协同程序在VS 2015 Update1上的状态。VS2015 Update 1发布内容详见这里。 取消的一些限制: · 现在ARM, x86 和amd64上支持协同程序 · 现在协同程序支持异常处理 · 现在协同程序在await或者yield之前可使用return语句 · 现在协同程序可同/ZI选项一起使用(编辑并且继续调试) 仍存在的缺陷: · 不兼容/sdl和/RTCx(会在VS Update 2上修复) · 关于协同程序中变量未使用或者未被初始化时,我们给出/W4警告是不准确的; 追踪最新的协同程序提议所做的更改设计(P0057): · Initial_suspend,final_suspend和yield_value必须返回awaitable · 通过重载promise 的operator new而不是提供一个分配器对象来实现配置定制化 · 通过operator await可以自定义Await · Yield不是一个语句而是一个表达式…

0

VS 2015 Update 1中C++Modules

[原文发表地址] http://blogs.msdn.com/b/vcblog/archive/2015/12/03/c-modules-in-vs-2015-update-1.aspx [原文发表时间] 2015年12月3日 上午10:21 【这篇文章的作者是Gabriel Dos Reis和Andrew Pardoe】 VC++团队兴奋地预览着VS 2015 Update 1中的新功能: 第一次实验性的实现 C++模块系统,并提出了C++17。在2015年秋天夏威夷科纳的会议上, C++标准改进工作组通过了C++17技术规范的提案。技术规范草案的措辞是由C++标准核心工作组审查的。 Modules经常被作为一种提高编译速度的形式来讨论。但他们所提供的要比提高构建性多的多!C++Modules可以帮助你改进你的代码模块。事实上,模块化是提高编译和生成吞吐量的有效途径。Modules允许你在难以调试的预处理器状态下分离出你的代码。并且他们能使开发工具更容易的来处理你的代码。 Modules允许直接在你的代码中表达你的组件提供描述它所需要的功能的符号依赖,和这个依赖的边界。Modules通过头文件减少了复杂的预处理器voodoo去指定接口的需要。如果你没有其他选择,但不得不使用宏接口,条件编译和生成代码来工作,那这里的预处理器会是你的选择,并且和模块系统一起工作。预处理器是一个强大的工具,它虽然没有结构但它可以做C++Modules不能做的一些事情。预处理器的工作是生成语法分析器需要的预处理符号。其40年来不断创新,可以用来生成各种类型的文本,包括HTML源文件。 如果你想知道更多关于它的原则和其隐含的C++Modules设计选择的基本原理,那么现在停下来并建议你读读:C++模块系统。在2015年的CppCon上Gabriel Dos Reis也大谈C++Modules。这个视频在CppCon YouTube的频道上播放;谈话的幻灯片还可以在IsoCpp GitHub上观看。但是如果你想深入了解此功能提供了什么,请继续阅读! 在Visual C++2015 update1中的实现只是我们在持续不断努力工作的一个预览,所以我们渴望听到你的反馈意见。这是一个让你对C++主要功能产生影响的机会。我们想建立一个适合所有的开发人员与所有的编译器的C++模块系统,所以如果你有任何的反馈意见请告知我们。你可以通过modules@microsoft.com和我们联系。 在Visual C++ 2015update1中的Modules支持 首先,你应该知道模块支持完全由开关控制:/experimental:module。如果不使用此开关,则模块功能根本不会影响你的代码。另外,请注意,对模块的支持现在仅限于命令行工具。大量的IDE功能应该可以使用,但是完整的IDE集成还没有出现。此外,这次预览版本的重点是模块化。随着我们在C++语言功能支持上的提高,我们将在模块支持中优化构建吞吐量方面提高我们的注意力;如果开始没有模块化,它将太简单而不能复制一个特定的构建逻辑,但并没有对基本的问题产生重大的影响。 Modules生成 直截了当的创建并使用一个模块:开发人员仅仅声明一个源文件去包含一个模块的定义,可以写一个module M。然后她通过用export关键字包含每个模块和这些模块每个单独的声明,宣布源文件的那些部分也是模块接口的一部分。 任何顶级的声明都可以被导出,或者任何顶级声明的序列都应该被包含在括号之中。Modules不定义新的命名空间或以任何方式更改名称的查找规则。他们只允许开发人员指定并发布源代码文件的接口。但是,这里真的没有你需要学习的新名称查找规则。 在此示例中,函数f(int)和g(double,int)被当作module M的接口的一部分导出。 // file: foo.ixx module M; export int f(intx) {     return 2 + x; } export double g(doubley, int…

0

VS 2015 Update 1新增的C++核心准则检测器

[原文发表地址]  VS 2015 Update 1新增的C++核心准则检测器 [原文发表时间] 2015/12/03 7:57 PM [这篇文章是由Andrew Pardoe和Neil MacIntosh写的] 早在2015 年9月的CppCon 2015上, Neil宣布我们计划发布新的C++代码分析工具,这将执行C++核心准则里的一些规则。(此次谈话的视频:https://www.youtube.com/watch?v=rKlHvAw1z50 和幻灯片:ISOCpp GitHub repo。) 本周早些时候,我们做了这些代码分析工具的第一个系列,作为一个NuGet 包可以被Visual Studio 2015 Update 1的用户免费安装。目前,这个包包括边界和类型规则的检测器。并且,Herb Sutter在全员会议上(视频在https://www.youtube.com/watch?v=hEx5DNLWGgA)表示在将来的代码分析工具里我们将支持生命期规则的检查器。 这个包被命名为“Microsoft.CppCoreCheck”,链接:http://www.nuget.org/packages/Microsoft.CppCoreCheck. 为了启用新的代码分析工具,仅仅需要在你的工程中安装NuGet包。 NuGet包新增了一个额外的MSBuild目标文件,当你开启代码分析时调用。这个目标文件将CppCoreCheck作为PREfast代码分析工具的一个插件。你可以通过工程属性对话框里的代码分析区域的复选框开启代码分析功能。无论你选择什么样的规则集—只要你开启了代码分析功能,CPPCoreCheck规则将总是运行。 为了保证Visual Studio的用户受益于C++核心准则的实施,这些工具是很重要的第一步。请注意这个需要Visual Studio Update 1,以前的版本是不支持的。 这里有个这个工具可以找到什么类型的问题的例子: void main() {     int arr[10];           // BAD, warning 26494 will be fired     int* p = arr;          // BAD,…

0

VS 2015 Update 1 中带微软代码生成的Clang

[原文发表地址]Clang with Microsoft CodeGen in VS 2015 Update 1 [原文发表时间] 2015/12/4 7:17 PM [这篇博客的作者是Dave Bartolomeo 和Clang/C2 团队的组员] 在开发和维护跨平台C++代码方面,其中一个改变就是针对不同平台的不同编译器的问题。 你写的一些针对Windows平台的代码,用Visual C++编译器可以编译成功,但那时你针对安卓平台的编译就会失败,那是因为Clang的标准规格更为严格,你的代码恰好是按照比较宽容的Visual C++编写的。又或者你针对iOS用了一些新的代码,Clang可以编译成功,但是才发现这些新的C++语言,Visual C++是还无法支持的,你只能想办法重新实现这个方法而不用这个新的语言特性,或者生成一个单独的能够用Visual C++编译的Windows实现方式。 为了能够更加方便的进行跨平台代码的开发,使在Windows 和其他平台更好的工作, 我们为Visual Studio单独发布了一个额外的编译工具集, 叫带微软代码生成的Clang编译器。这个编译器为C语言和C++语言使用开源的Clang解析,还有Visual C++ 编译工具的代码生成器和优化器。像对其他平台一样,你可以为Windows使用相同的Clang解析你的跨平台代码,还能够充分利用Visual C++优化器先进的优化功能。因为针对非Windows平台,新的工具也使用的是一样的Clang解析,你不需要在代码里写满令人讨厌的#ifdefs,只需要为不同的编译器说明下即可。同时你的代码中可以使用那些还没有被Visual C++ 编译器所支持的语言特性, 包括C99 复杂类型和C++ 14 扩展的constexpr的支持。因为基于Clang的编译器会长生和Visual C++编译器一样格式的调试的信息,所以你能感受到同样很棒的Visual Studio 调试器体验。 用新的编译工具所编译的代码能够和Visual C++ 2015 C和C++编译器所编译的其他代码相链接。通常,你可以使用带微软代码生成的Clang编译器来编译跨平台代码,用普通的Visual C++ 工具集来编译特定的Windows代码(例如,你的UI)。 请注意,带微软代码生成的Clang编译器现在是一个预览功能。 我们知道在很多方面它还不够完善,仍存在一些漏洞。我们希望你可以尝试使用这个新功能,明白它如在应用在你的代码工作上,并给我们反馈。 安装 在Visual Studio 2015 Update 1中,Visual Studio安装时开始进行功能选择时的UI界面,你会看到在“跨平台和手机开发\Visual…

0

加快增量开发者构建方案

[原文发表地址] VisualC++ Team Blog ->Speeding up the Incremental Developer Build Scenario [原文发表时间]2014/11/12 3:35PM 概述 Visual C++的主要关注领域之一是不断提高开发人员的生产率。牢记于此,很多的改进旨在开发者增量场景已经被引入了Visual Studio 2015 preview(下载点击这里)。增量开发者方案指的是,开发人员修改了单个或多个源文件(在修复bug的时候),再构建。这种构建方案对于Visual C ++来说大致相当于一次链接便携式可执行文件(.dll 或 .exe )花费的时间。当然正在这篇文章中讨论这种功能大多运用在链接器空间。  在链接器空间的新增功能,平均而言,我们已经看到了大约2倍提高简洁链接的情况,并增加了更多的方案,包括现在可以增量链接或增量代码生成(当使用链接时代码生成(LTCG))。下面总结了这些功能集以及如何使他们并附于下表,但如果你有兴趣了解更多关于这些功能的话,请继续沿着下面的部分阅读。    特性 描述 组态 用法 静态库的增量链接 增量连接当编辑被其他可携带执行文件调用的静态库(.dll 或者.exe) 影响所有除了LTCG启用构建 默认情况下启用时(/incremental)链接器开关。 /Debug:FastLink 调试时获得快速的链路吞吐量生成新的程序数据库(PDB)文件。 影响所有除了LTCG启用构建。 /Debug:FASTLINK(链接器开关) /Zc:inline和算法的改进 编译器不再为死代码生成符号信息。 影响所有除了LTCG启用构建。 / ZC:inline(编译器开关) 增量LTCG     (仅目标机器为x86) 当LTCG启用工作基础之上,启用增量代码生成。 仅影响LTCG建立。 / LTCG:incremental(linker switch)    …

0

VS 2014 Preview 中的本地内存诊断

[原文发表地址]Native Memory Diagnostics in VS2015 Preview [原文发表时间]2014/11/21 7:19PM 在Visual Studio 2013 Update 2 和早期发布的VisualStudio 2015, CTP, 我们发布了一个内存诊断工具, 这个工具允许开发者截取应用程序的堆快照, 然后在终止它研究堆内容。在最初发布的版本中,支持查看堆管理和本地对象。并且在第一个Visual Studio2015 update CTP中增加了支持本机类型推导和值检验。 虽然这个工具是提供VisualStudio开发者含有一个收件箱内存分析器的一个良好开端, 但是在特定的程序状态下, 它缺乏一种轻松的分析堆内容的能力。因为为了更深层的研究数据,整个程序必须关闭。 改进的内存分析器进行预览 现在在Preview上,有一个新改进的内存分析器是可用的。它允许开发人员利用调试器强大的程序流程的控制力,并且在任何破发状态可以检验他们应用程序的堆内容。这是一个很好的对新的内存分析总结经验的一个概述。一个深入的特性总结完成了指令的激活功能。(我在那里找到它?章节),  在下面的这些指令是在第一次激活这个工具。 在调试期间,简单的按下F5将会启动新的分析器。现在为了查看堆快照不需要去终止程序。 这篇文章的剩余部分将集中介绍利用本机程序的新工具和详细介绍该工具的工作流程细节。 演示:分析 a Native MFC App 要展示新的内存分析器,一个被称为FamiTracker的MFC开源芯片定序器已经被加载到Visual Studio,并且为了建立新的编译器做了简单的修改。在启动内存分析器后,在应用程序中通过注册密钥和启动调试场景利用F5,工具加载。很快内存使用情况将被显示,并且下面的堆快照也将被显示:   快照可以在不同的点及时地的捕获堆状态,例如值仅可见于最近拍照时和处于破发状态时。 在这次练习中,对于FamiTracker,初始的程序状态是初始化序列UI:                                              FamiTracker 初始化编曲界面 另一个称为编辑器工具窗口会被打开为了编辑每一个编辑器的属性:                                           FamiTracker 编辑器窗口 利用新的内存分析器,为了更好的理解应用程序的内存消耗,我们将采取堆快照跨越两种程序状态。 首先,我们截取一个基本的快照为了储存初始化的堆内容: 工具编辑框被打开,这将在代码中触发一个断点,并且在程序状态中开始了一个变化,这个函数初始化工具编辑对话框和激活其它的一些辅助功能, 这将有助于创建工具编辑器的UI。 在OnInitDialog()开始断点的位置开始截取快照, 我们看到应用程序的堆内容之前,工具编辑器对话框启动分配对象。快照将列出对象类型,数量和内存占用。 由于我们在休息状态下, 通过双击某一行或者图标: 选择一个类型可以看到针对每一个实例的所有类型的分配情况,完整值和分配的调用堆栈。下面是所有CCHannelHandlerN163[]的实例:  …

0