VS2015 Update 1中的常量表达式

[原文发表地址]Constexpr in VS2015 Update 1 [原文发表时间] 2015/12/2 1:44 PM VS2015 RTM已集成支持C++11标准中指定的常量表达式。此版本收到了来自用户和C++社区很多较好的反馈。基于这样的反馈,在VS2015 Update1 中我们一直致力于完善新特性的实现工作。我们在VS2015 Update1中的目标是完成C++11常量表达式最后一个重大功能和提高我们所并健全所实现的特性。这篇博客将会提供一些注释去解释我们在VS2015 Update 1中集成重点以及在哪些地方支持常量表达式。 静态初始化器 VS 2015引进一个警告,在对常量表达式进行评估时,它会指示编译器检测和并使用初始值,但是并不能静态地释放这些初始值。这也就是说,虽然编译器可以从已编译的可执行文件加载足够的信息来释放完全实例化的类型,但它并没有释放。这些类型在运行时被实例化和构造,正如大多数传统的C++对象一样。 好消息是,VS2015 Update1现在支持释放这些静态初始值。这些类型在加载到内存时将被完全实例化,而不是在运行时初始化它们。这是所需要实现的最后一个C++11常量表达式功能,我们很高兴在Update 1中集成了这一功能。 我们应该将荣誉归于Tanveer Gani,为了在Update 1中集成该功能,他完成了很多艰巨工作。基于他的工作,在Update1中已完全支持释放常量表达式对象的静态初始值。并且部分支持含有常量表达式构造函数的非文本类型对象的初始化(详见C++标准文档3.6.2节) 。需要特别要指出,依然不支持虚函数类型。 静态初始化器是实现std::once_flag的重要部分,它被用于实现std::call_once。Stephan在他的博客中描述了STL在VS2015 RTM版本中的改进。 VS2015 Update 1中在运行时的执行时期生成代码的减少量是相当惊人的。我想花些时间用一些例子去探讨这一变化。 例1:常量表达式对象的初始化 我们先从一个简单的例子开始——一个简单的含有常量表达式构造函数的结构体。 struct Point {     constexpr Point(int x1, int y1)     : x(x1), y(y1)     {}    int x;    int y; };…

0

在VS2015 Update 1中关于STL的修改

[原文发表地址] 在VS2015 Update1中关于STL的修改 [原文发表时间] 2015/12/7 9:20AM VS 2015 Update 1 现在已经发布了,并且这个版本里包含了许多关于STL的修复。(这是自从2010 SP1起我们第一次将对STL的修改放到一个次要的版本上。在VS2015RTM 版本基本情况良好,没有出现严重的崩溃我们仅仅只是想尽快地向您分享我们的改进,并且我们内部的工序也将会使这变得更加容易) 通常,就像在2015RTM上的修复日志Part1和Part2一样我会写一个详尽地更新日志。请注意,update 1里还包含和很多对编译器/集成开发环境等功能的改进(包括部分支持SFINAE表达式), 但是在这里暂不涉及这些- 毕竟我无法去亲自跟踪每一件事情。 首先,最近Steve Wishnousky 加入了VC类库小组,他已经在update 1上修复了两个bug: * unordered_meow::max_bucket_count()这个函数返回了一个错误值(VS0#144294/Connect#1764567). 现在返回值正常。 * 我们的内部帮助函数 _Allocate() 和 _Deallocate() 因为不必要的模板化,生成了比必要模板化时更大的对象文件 (VS0#130290). 现在,他们将不再被模板化,这也使打包对象文件变得更加轻便简洁。 同样的,Hong Hong修复了出现在在<future>上的两个bug,这些bug 是因为在<future>的内部含有<ppltasks.h>等引起的。 *<future> 在不能支持_HAS_EXCEPTIONS=0 的情况下进行编译(TFS#1127004/Connect#1137364).  虽然这些问题目前在微软没有记录、验证和支持,但是不管怎样,我们还是最终决定把这些问题修复了。 * <future>间接定义了一个不规范的函数stdx::declval()(TFS#1194345/Connect#1494998)。这个目前已经被它重命名为Concurrency::details::declval()。(就目前来说,<future>引入 non-_Ugly Concurrency命名空间以及在此范围内的一些机制,这些都是我们期望的。) 接下来是我修复的一些bug: * enable_shared_from_this<X>在调用 shared_ptr<volatile X>时会出现编译失败 (TFS#1184701) 。现在volatile可以像const那样正常运行。 * allocator_traits 错误地认为UserAlloc类的构造函数和析构函数返回空类型(在他们存在时),这将触发编译器在返回值非空类型时报错:(TFS#1184701)。现在我们能正确得接收(或者忽略)返回非空类型的场景。 * 在…

0

Visual Studio对安卓CMake 工程的支持

[原文发表地址] Support for Android CMake projects in Visual Studio [原文发表时间] 2015/12/16 3:16 AM CMake 是一个跨平台工程生成工具,它能让共享的C++跨平台代码在其他多种IDE环境和工程中重复利用。 在Visual Studio中,我们做了一些改变,使CMAKE能支持Android工具链。有了这一改变,你只需做最小的改动,就可以将现有的CMAKE工程变成Android目标平台的工程,你可以在Visual Studio打开你的工程,充分感受到我们丰富的Android集成开发环境的好处。 我们已经在努力做微软CMake 开源github资源库,也打算和Kitware合作将这些改变集成在公开的CMake资源库。 但是当下,下面是你们需要做的一些步骤。 前提条件,请在Visual Studio上安装Android MDD包 获取CMake 在Microsoft CMake 资源库的VCMDDSndroid下面。  请点击“Download ZIP”按钮 ,下载离线备份的VCMDDAndroid,并解压。            从https://cmake.org/download/安装CMake3.4.1,这是编译CMake做必须的,推荐Win32 安装器。  在解压缩的文件目录下,运行 cmake –G “Visual Studio 14” ,这个会从根目录下启动CMake ,大概会花15分钟左右。 这样将会使用Visual Studio 2015生成工具,和生成Visual Studio工程。目的是在Visual Studio中编译CMake。              在CMake运行后,在out文件中应该有Visual Studio 工程。 运行 msbuild cmake.sln,这将会编译CMake, 你可以在VS2015…

0

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

使用Visual Studio 2015调试 Marmalade所构建的Android应用

[原文发表地址]: Using Visual Studio 2015 to debug an Android app built with Marmalade [原文发表时间]:2015/12/7 2:52 PM 对于本篇博客,我们欢迎来自Marmalade (https://www.madewithmarmalade.com)的客座作者Alex Baude。他的团队最近发布的Marmalade Platform现在支持Visual Studio 2015,因此我们邀请他就这方面的工作给我们提供更丰富的信息。 Visual Studio 2015为在Android平台上构建和调试跨平台C++代码提供了新的跨平台本地开发技术。开箱即用,Visual Studio 2015提供了基于Android Native-Activity的工程模板,可以快速创建高性能的应用程序。 Marmalade平台包括一个跨平台C++SDK,Marmalade Core,它的一个关键功能是一个平台抽象API,将本地平台的多数复杂性隐藏了起来,并且开发人员可以编写一次代码而部署于很多目标。基于C++的Marmalade Core 应用程序可以部署到iOS,Android,NaCL,Windows Phone,以及Windows 10等等。 而现在,根据我们最新发布的SDK,我们对Visual Studio 2015的这项新的跨平台功能进行了扩充,本地调试的Marmalade Core 应用程序可以在Android(x86)的Visual Studio Emulator或连接的Android设备(ARM)上运行。 使用Visual Studio 2015构建一个Marmalade Core应用程序 Marmalade Core工程默认生成一个Visual Studio解决方案,它能生成一个可以无需重复编译即可部署到多个目标平台的应用程序二进制。所以它也叫做”单一二进制“,使用Marmalade专有技术,可以用来从Windows机器以及Android机器部署到iOS上。这种类型的Visual Studio解决方案,对于分布式的编程或在Marmalade桌面模拟器上调试是理想的。 对于设备本地调试,Marmalade Core工程也可以生成一个特殊的Visual Studio解决方案,它可以在Window Phone、Windows 10上调试, 现在也可以在Android上调试。…

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 中部分支持SFINAE表达式

在VS 2015 Update 1 中部分支持SFINAE表达式 [原文发表地址] 在VS2015 Update 1 中部分支持SFINAE表达式 [原文发表时间] 2015/12/2 5:00PM 在VS 2015 Update 1  中,我们添加了部分支持c++11 核心语言模块SFINAE 表达式。 SFINAE 是什么? SFINAE是“Substitution Failure Is Not An Error”的缩写。在重载解析期间,当编译器尝试去特化一个函数模板的时候,如果特化失败而且还有其他有效的匹配,这也是可以的。C++ 11 引进了像decltype 和constexpr一些模块,在模板参数推论和匹配的过程中有一个表达式这将会变得更加的普遍。C++ 标准委员会规定了在C++11表达式的SFINAE 规则。 为什么SFINAE表达式目前只是部分实现? 主要原因有以下两点: 我们正在逐渐的改善Visual C++编译程序的语法解析器,这种解析器将会密切关注SFINAE表达式模块完成的一致性。对于这个工作更多的了解,您可以看Jim Springfield 编写的 更新微软C/C++ 编译器 在Visual Studio 2015 RTM中,我们并没有提供表达式的SFINAE 规则只是对于SFINAE表达式提供了一些受限的支持。从Visual Studio 2015 Update 1 开始我们将完善SFINAE表达式争取与C++ 11标准上的达成一致。 我们做了什么? 我们仍然在用基于stream的旧的标识的方法 还没有用到递归向下分析树。…

0

Visual Studio 2015 Update 1 对C++编辑并继续功能的改进

[原文发表地址] Improvements for C++ Edit and Continue in Visual Studio 2015 Update 1 [原文发表时间] 在Visual Studio2015 RTM中,我们宣布使用VC++ 2015 工具包(v140)的默认调试引擎对X86和X64的C++程序支持编辑并继续(EnC)功能。在过去的几个月,我们一直在努力改善该功能的使用体验和支持新的配置。在这篇博客中,我会演示Visual Studio2015 Update 1中对C++ EnC所做的改进。 快速回顾一下 – 编辑并继续允许你在运行时(调试时)修改你的代码,而不需要停下来,重新编译和重新启动应用程序!举例来说,如果你正在调试,并且注意到你的代码的函数中有错误,当程序在断点处停下,你可以修改你的源文件,点击继续(GO或者步骤的命令),调试器将应用代码更改到被调试的进程并继续调试你的新代码!这可以帮助加快您的编辑>生成>部署>调试周期。请参见我们之前的2015 RTM的博客了解更多的细节。 2015 Update 1 中EnC功能的改进 支持Windows应用程序和DirectX应用程序(支持/bigobj编译器开关): Update 1中的VC ++2015工具包现在支持/ZI编译器开关(EnC开关)与/bigobj一起使用,对于Windows应用程序和DirectX应用程序,这是默认启用的。 支持链接时带有/DEBUG:FASTLINK调试信息的二进制文件:FASTLINK是一个可以加快生成时间的链接开关(留某些调试信息在obj文件中,而不是整合所有的信息到PDB文件中)。Update 1 中的VC++2015工具包现在支持在使用FASTLINK链接开关链接而成的二进制文件中使用EnC功能。 在ENC期间显示可取消的等待对话框:我们现在显示等待对话框来通知用户执行的进度,保持用户界面响应,同时还支持取消。         告知用户,如果被修改的文件不支持EnC:关于EnC易用性的一个常见的不满是,诊断*为什么*编辑会被Visual Studio忽视非常的困难。这通常是由于编译器或链接器开关与EnC不兼容(比如没有使用 /ZI编译器开关或 /INCREMENTAL链接器开关)。 在Update 1中,如果一个源文件在调试过程中被修改,但没有正确的配置(如不兼容的编译器/链接器开关),这时会显示一个错误对话框,它带有关于为什么编辑不被支持的可操作信息。 例如,如果编译源文件时使用/Zi(而不是/ ZI),现在编辑将失败,并且显示一个错误对话框和以下错误(在错误列表中或输出>生成窗口): 你可以通过在错误对话框中点击“忽略”按钮来选择忽略这些错误。 · 预留更多的内存,以便应用更多的编辑到二进制文件中:在使用EnC选项(/ZI编译开关和 /INCREMENTAL链接开关)生成的二进制文件中预留更多的内存以防止可怕的“超出模块 [模块名称] 预留的地址空间“的错误信息。随着这一变化,在被迫停下来重新编译二进制文件之前,你将能够做更多的编辑。 ·…

0

Visual Studio 2015 Update 1在这里

[原文发表地址]: Visual Studio 2015 Update 1 Is Here [发布发表时间]: 2015/12/1 2:52 PM 你是否错过了Visual Studio博客 昨天发布的Visual Studio 2015 Update 1公告? 在这里查看发行说明 从面包屑模板下面的: 文件 -> 新建 -> C++ ->跨平台安装 C2/Clang支持, 或者新安装的Visual Studio,从"Visual C++ 移动开发"下面安装。 使用IncrediBuild和Visual Studio 2015 改进编译次数 Visual C++编译工具2015预发布 C++ 核心准则(NuGet 包) C++ 编辑和继续的改进 C++ 协同程序 继续在这里查看关于以上以及其它功能的详细信息。 在用户之声,或者通过产品用户界面的反馈分享您的意见,建议,想法以及创意,或者通过在Visual Studio Connect网站提交一个bug。 谢谢! 公告

0