C :使用 Visual C 2005 的现代语言特色编写更快的代码(6)
添加时间:2007-09-01 原文发表:2007-08-31 人气:87 来源:vckbase.com
本文章共13664字,分9页,当前第6页,快速翻页:
| |
然而,只因为代码是与 CLI 相兼容的,并不能代表它就是经过验证的,而这对于相当代码是从共享文件中载入这种低信任度情况下是一个尤为重要的指标。在另外的一个极端,微软引入了一个更为严格的编译器标
标志:/clr:safe。这对于 C 开发人员来讲可以说是获得经过验证代码的圣杯。引用这个开关会使编译器确保生成的程序集是完全经过验证的;任何没有经过验证的结构都会抛出编译时错误。举个例子,试
图将一个整型指针编译成一个变量时,将会产生:
"int* = this type is not verifiable"
的错误,意思是“int* = 该类型没有经过验证”,并标出包含无效结构的代码行。有一些情况下使用这一极端做法是适当的。比如说,所有在 SQL
Server 2005 中运行为存储过程的 C 代码都应以此标志编译。
逆@风@者

Figure 5 兼容模式
Figure 5 描述了数据及代码的托管与非托管环境,并且显示出其中哪种环境是不同编译器标志的对象。不包含任何/clr标志将导致生成完全本机镜像。使用/clr标志将会形成兼具托管与非托管代码和数据的混合镜像。由使用 /clr:pure
标志生成的纯 MSIL 将不会包含任何非托管代码,尽管这并不保证是经过验证的,而且可能会包含本机类型。安全的 MSIL 是验证的最终状态,其目标只是.NET框架。一句话,这两种新的编译模式将会使以前或是不可能或是难以实现的多种情况变为现实。
优化
所有优秀的软件开发人员都想要他们的软件产品有一个好的性能,编译器编写人员是一种特殊的开发人员;他们的代码不仅要有好的性能,而且由他们写出的代码生成的代码一定也要尽可能的高效。为了这种原因,任何成功的编译器背后必须
要有一个好的优化支持。在这方面,Visual
C 2005是无可挑剔的。
Visual Studio .NET 2002 和 Visual Studio .NET 2003 由于在本机代码的性能提高方面做了很多的工作,它们加入了对 C 编译器一些惊人的优化。在加入了 SSE
和 SSE2 框架的同时,它们还提供了面向 Intel 奔腾4芯片的支持。最为显著的是加入了 Whole Program Optimization (WPO)[译者注:全局程序优化],它允许
链接器在把每个经过编译的.cpp文件变成.obj文件时对整个程序进行优化。这些目标文件和普通的目标文件有所不同
,因为与其包含本机代码,不如包含用来在编译器前端和后端相互通讯的中间语言。然后链接器就能将这些文件优化为一个大的单元,这就能提供更多的内联机会,更好的栈对齐选择和在其它不同情况下的优化中的自定义调用
规范的可能性。Visual
C 2005 使用由下至上,至上而下分析这样的新特性来改善全局程序优化(WPO),但是较大的改善是以由 Profile Guided
Optimization(POGO)[译者注:配置指导的优化]这一形式出现的。这种在编译器中的提供的新功能将会对性能有所改进。
对一个编译器来说,对源代码的静态分析将会留下许多开放性问题。如果在一个if语句中比较两个变量,第一个变量比第二个变量大的频率是多少?在一个switch语句中,哪一
个case被选中的次数最多?那些函数使用的最多,其中哪些代码最不经常使用?如果编译器在编译时,就知道代码在运行时该如何使用的话,它就可以在大多数情况下提供优化。这正是 Visual
C 编译器能够做到的。

Figure 6 由配置指导的优化
POGO 的编译过程如 Figure 6 所示,第一步包含编译代码并将其链接成一个工具化构造,它具备一整套配置信息探测器。当使用全局优化的时候,由编译器生成并导入
链接器的目标文件,是由中间语言而不是本机代码构成。这些探测器有两种:值探测器和计数探测器。值探测器用来构造变量控制的直方图,而计数探测器被用来追踪你在应用程序中
往返某一特殊路径的次数,当应用程序运行的时候,在正常使用时,数据从所有这些探测器汇集而成,并被写入一个配置数据库。这一配置数据和原来的目标文件一起被导入链接器。
链接器能够分析配置数据,决定应该采用的特殊的优化,并生成一个新的非规范化的应用程序结构。这只是一个经过编译的版本而不是一个可以用来发布给客户的规范的版本。 本文章更多内容:<<上一页 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 下一页>> |
 本文章所属分类: 首页
→ VC++
|
文章搜索
热门文章
推荐文章
最新文章
|