【IT168 专稿】在“从VC++6.0不足看Visual C++2010新特性”一文中,我们了解到Visual C++ 2010在语言层面开始支持最新的C++标准,在IDE以及MFC库等方面,也都有了质的变化。对于集成开发环境(IDE)来说,以前的版本中也都有所改变,但都是几次不大的更新。Visual C++ 2010中对IDE有着革命性的增强。
我们知道Visual C++ 开发环境为项目管理与配置(包括更好地支持大型项目)、源代码编辑、源代码浏览和调试工具提供强力的支持,是开发过程中不可缺少的工具,是提高代码生产力的基本保障。在本文中,我们将对Visual C++ 2010 IDE新特性进行剖析,主要从MSBuild改进的项目和生成系统、更快的编译和更高的性能、更加智能的 IntelliSense、#include 自动完成功能、新的编辑环境等五个方面进行阐述。
MSBuild改进的项目和生成系统
Visual C++ 2010中,解决方案和项目的构建系统(build system)从原先基于VCBuild的构建系统,迁移到基于MSBuild(Microsoft Build Engine)的构建系统。那么MSBuild 是什么呢?MSBuild 是 Visual C++ 项目的标准生成系统,是一个基于 XML 的项目文件或可选设置文件的工具。它集成在Visual Studio的开发环境中,为Visual C++ 生成过程提供了便利,提高了效率。MSBuild的加入,使得“一次编码,多个平台运行”成为可能。
在Visual Studio的早期版本中,只能使用当前版本提供的工具集,如果您想使用新的集成开发环境(IDE),您必须等到能够迁移到新工具集的时候,这给一些时尚的开发人员带来了许多不便。Visual Studio 2010 允许您以多个工具集版本为目标进行生成系统。通过 Visual Studio 2010,您可以将应用程序编译为在若干 .NET Framework 版本的任意一个上运行。 例如,可以将同一个应用程序编译为既能在 .NET Framework 3.5 版本上运行,也能在 .NET Framework 4 版本上运行。下图显示了属性页上的本机多定向设置,您可以将 Visual C++ 9.0 编译器和库作为目标,同时在 Visual Studio 2010 中工作。
图 1 以多个平台为目标的工具集
另外,由于MSBuild 使用基于 XML 的项目文件格式,该格式直接明了,可扩展性强,同时也增强了C++ 生成系统的可扩展性。当默认生成系统不足以满足您的需求时,可以通过添加自己的工具或任意其他生成步骤来扩展该系统。MSBuild使用任务作为可执行代码的可重复使用单元来执行生成操作,您可以通过在XML文件中定义自己的任务来扩展系统,MSBuild会使用这些XML文件动态生成任务。
下面的示例描述通过XML文件动态生成任务。该项目包含两个任务:一个是 GenerateResource 任务,用于编译资源;一个是 Csc 任务,用于编译源代码文件和编译的资源文件。 由 GenerateResource 任务编译的资源文件存储在 Resources 项中并传递给 Csc 任务。
更快的编译和更高的性能
Visual Studio 2010通过增强编译器后端的代码生成功能来提高生成应用程序的编译速度、质量和性能。主要表现以下几个方面:
通过优化单指令多数据(SIMD)的代码生成功能,提高代编译器的性能和代码质量。其中的改进主要包括打破错误依赖关系,向量化常量向量初始化,更好地分配 XMM 寄存器消除多余的负载、存储和移动。
通过优化x64 代码生成提高x64 平台上的编译速度。LTCG编译(链接时间代码生成)通常会比非LTCG 编译占用更长的时间,尤其是对于大型的应用程序。在 Visual Studio 2010 中,LTCG 编译速度提高高达 30%。在该版本中引入了一个写入 PDB 文件的专用线程,因此您在使用 /DEBUG 开关时会看到链接时间的缩减。
通过添加对被检测二进制文件的非锁定版本的支持,PGO(按配置优化)检测的运行速度有所提高。还有一个新的 POGO 选项 PogoSafeMode,用于指定优化应用程序时使用安全模式还是快速模式。快速模式是默认行为。安全模式是线程安全的,但比快速模式要慢。
编译器生成的代码的质量也有所提高。现在完全支持高级矢量扩展 (AVX),这对于 AMD 和 Intel 处理器中通过固有选项和 /arch:AVX 选项进行大量浮点计算的应用程序非常重要,使用 /fp:fast 选项可以使浮点计算更为精确。
更加智能的 IntelliSense
Visual Studio 2010 中包含了全新的 IntelliSense 和浏览基础结构。除了帮助调整和响应具有大型基本代码的项目,此基础结构改进还带来了一些新的设计时效率功能。
如实时错误报告和快速信息工具提示这样的 IntelliSense 功能基于新的编译器前端,即使代码文件正在修改中,该前端也能分析完整的转换单元以提供关于代码语义的丰富且准确的信息。
所有代码浏览功能(如类视图和类层次结构)现在都使用 SQL 数据库中存储的源代码信息,该数据库启用了索引功能并具有固定的内存占用量。与以前的版本不同,Visual Studio 2010 IDE 始终具有响应能力,当编译单元由于头文件发生更改而重新分析时,您不再需要等待。
IntelliSense 实时错误报告(在错误下显示红色波浪下划线)在浏览和编辑代码时显示编译器质量语法和语义错误。将鼠标悬停在错误上即可查看错误消息(请参见下图)。错误列表窗口也会显示当前查看的文件中的错误以及编译单元其他位置的 IntelliSense 错误。不必进行生成即可获得所有这些信息。若要显示导致问题的代码,请在“错误列表”窗口中双击错误。
图2 IntelliSense 错误实时报告
该功能的增强,可以提供智能化且特定于上下文的建议,方便处理更多的文件、更加复杂的项目。值的注意的是,虽然所有代码浏览功能都可用于纯 C++ 和 C++/CLI,但像实时错误报告和快速信息这样的 IntelliSense 相关功能在 Visual Studio 2010 最终版中不可用于 C++/CLI。
#include 自动完成功能
在包含头文件时,也增加了自动完成和过滤功能。键入 #include 时,集成开发环境将自动创建一个包含有效的头文件的下拉列表供您选择。如果你继续输入一个文件名,集成开发环境将自动根据您的输入加以过滤。在任何时候,你都可以根据这个列表来选择你想要包含的文件。因此,这一功能可以让程序员快速地包含那些尚不确切知道文件名的文件。
图3 包含头文件自动完成功能
新的编辑环境
(1)新的搜索定位功能
新的“定位到”功能。选择菜单“编辑”中的“定位到”,该功能可以帮助您更有效的搜索文件或符号。根据您输入的字符串实时搜索到相应的结果,将您的输入字符串与项目中的符号和文件对照匹配。此功能还适用于 C# 和 Visual Basic 文件,并且可进行扩展。
图4 “定位到”功能窗口
(2)新的调用层次结构
调用层次结构(Ctrl+K、Ctrl+T)可以定位到从某一特定函数调用的所有函数,以及对特定函数进行调用的所有函数。这是以前的 Visual Studio 版本中存在的“调用浏览器”功能的改进版本。“调用层次结构”窗口组织得更好,对同一窗口中出现的任何函数同时提供调用来源和调用目标树。
图5 “调用层次结构”窗口
(3)灵活的查找引用功能
此版本中还对其他一些主要编辑器功能做出了改进。例如,用于在整个解决方案中搜索对代码元素(类、类成员、函数等)的引用的“查找所有引用”功能现在更为灵活。使用右键单击上下文菜单中的“解析结果”选项可进一步精简搜索结果。
图6 查找引用结果
在编辑器方面,除了上面改进的功能外,常规编辑器在 Visual Studio 2010 中也得到了增强。为消除混乱并提高可读性,新的基于WPF(Windows Presentation Foundation)的 IDE 经过了重新设计。像代码编辑器和设计视图这样的文档窗口现在可以浮动在主 IDE 窗口之外,并可在多个监视器中显示。使用 Ctrl 键和鼠标滚轮可以轻松缩放代码编辑器窗口。
而在我们熟悉的VC++ 6.0的IDE里面,微软对开发人员就没有这么优待了,它没有“定位到”的功能。在VC++ 6.0里,定位和搜索只能是使用“查找”和“转到”的功能,实现定位到需要查找的位置,则要经过很多步的操作,显然,这不是特别灵活,用户体验不是很友好。下图是“查找”和“转到”窗口。
图7 VC++ 6.0的查找和转到窗口
对于“调用层次结构”和“查找引用”等功能,更是少之又少了。选中某一个成员方法,只有“列出成员”、“转到定义”等一些功能,不能像Visual C++ 2010那样显示类之间的调用关系,仅仅是一个简单的罗列。如下图,选中成员方法的列出成员操作。
图8 VC++ 6.0 对成员方法列出成员的功能
以上,简单列举了VC++ 6.0相对于Visual C++ 2010在编辑环境方面的一些差异,无论从用户体验,还是从性能方面,Visual C++ 2010有着巨大的改进,VC++ 6.0是远远不能攀比的。
小结
通过以上五个方面的介绍,我们可以明确看出,在Visual C++ 2010版本中,微软真是绞尽脑汁的进行了一场翻天覆地的变化,给一直受到冷落的Visual C++一次重新崛起的机会。增强的IDE,不仅改善了效率,同时也改善了用户体验,这些增强能大大提高程序员们的开发效率,同时带来更高的代码生产力与开发、调试的便捷。Visual C++ 2010实现了我们目标:更优、更快、更便捷。