对Visual C++ 2005编译器进行学习研究

微软Visual C++开发小组在广泛听取意见的基础上,重新改进了c,在Visual Studio .NET 2002中那种“笨拙”的C++托管扩展语法已经一去不复返了,而修订后的语言定义带来的是一个完全充满吸引力的新语法。

和一体化的语言支持特性,如部分模板专用化;同时也包括了增强的缓冲区安全检查和改进的编译器诊断功能。以往使用C#和Visual Basic® .NET的开发者,通过简单的拖放操作,就能生成稳健的Windows窗体应用程序,如今,C++的开发者也加入了进来。

而且,这个编译器还对Intel Pentium 4和AMD Athlon处理器作了优化处理。如果Visual C++ .NET 2003都令你兴奋不已,那么它的最新版本Visual C++ 2005,足够令你高兴得发狂了。对于 .NET开发,Visual C++ 2005如今有了一套新的语法,不但显得更“优雅”,而且更强大;

它拥有新的优化技术,可使程序的速度最高提高30%;同时新的编译模式,可保证在Microsoft® .NET Framework之上生成完全遵从CLI(Common Language Infrastructure)的可验证代码;而且新的interop模式,可提供本地与托管代码的无缝融合。

相对于前两个版本,新编译器还包括了一个增强版本的缓冲区安全检查选项,而且对C++程序普遍使用的库,也有新的注重安全的版本。Visual C++ 2005对基于Intel Itanium和AMD64的64位平台,提供了对OpenMP标准的支持,并且修正了一些混合DLL加载的问题,对Double P/Invoke(双转换)的性能问题,提供了自动运行时消除。关于类似的增强和改进还有很多很多,正如一位C++架构师说的那样,“如今,C++终于站在了它应该站的位置上”。

可能我们中有不少人都发现,要在前两个版本的C++中使用托管扩展语法,会非常麻烦并且错误重重,也许还会觉得,Visual C++并非是 .NET开发的首选语言。

微软Visual C++开发小组在广泛听取意见的基础上,重新改进了c,在Visual Studio .NET 2002中那种“笨拙”的C++托管扩展语法已经一去不复返了,而修订后的语言定义带来的是一个完全充满吸引力的新语法。在语言设计上,微软Visual C++开发小组制定了一些主要的目标。

首先(对那些认为编程是艺术的人来说,也许是最重要的),他们要保证在开发者在编写C++代码时感觉自然,为达到这个目的,他们对ISO C++标准作了一个在语法上优雅的纯粹扩展,目的是为了在像单击部署、窗体设计支持和SQL Server™ 2005的托管代码支持这些地方。

可更简单地用C++编写可验证的代码。他们想要设计出一个超过C++的语言,要带给C++全部的 .NET能力,同时也要带给 .NET全部的C++能力。现在看来,他们非常的成功。

新的扩展规范被称为“Visual C++ 2005”,并且正在被标准化。在阅读代码时,最引人注意之处就是,以往那种在托管扩展中定义垃圾回收类、属性等等常用到的双下划线关键字,现在已成为了历史。虽然也有一些类似的关键字被保留,但由于不会被经常用到,所以不会对代码的可读性造成影响。这些双下划线关键字如今被两种新的“关键字”取代:“上下文敏感”和“空格”。“上下文敏感”关键字是只在特定的上下文中,才是关键字;

而“空格”关键字只在联合其他关键字时,才会是关键字。例如:在托管扩展中的关键字__property已被关键字property取代(不只是这样,定义和访问属性的整个语法都被精炼了,它的声明与C#看起来很相似,参见插1),而且在你的代码中,还可以使用property作为变量名,只有在一个类型中声明属性时,“property”才会被当作一个关键字。

现在,Visual C++ 2005对任何类型的托管和本地对象,都提供了一个析构函数或结束器(finalizer)。当类型是托管时,编译器映射一个析构函数到IDisposable::Dispose方法中。

这意味着,你可用C++来编写同样的方法――如插3中的第四段代码,而且reader的析构或清除方法会被自动调用,就好像在C#中使用“using”一样。这样,当创建在堆栈上的类型超出作用范围之后,它的析构函数就会被调用。
托管扩展带来的最大问题就是指针问题了。

虽然指针很难理解,但却是应付多种任务和多种情况的“多面手”。在Visual C++ 2005中,指针仍旧是老式的C++指针,它指向一个对象,并能执行一些算法。引用一个对象的指针,它的生存期必须由开发者显示地管理,当与指针打交道时,运行时库可不负责清理它。

现在,来看一下Visual C++ 2005的设计者是怎样实现的吧,Visual Studio .NET 2003和Visual Studio .NET 2005中的new操作符通常返回一个指针,而gcnew操作符返回一个“句柄”,一个用脱字符 ^ 语法表示的一个结构,此句柄指向托管堆的对象。

因此,它们不能指向interior类型,而且在用法上,编译器也作了不少限制,以便开发者正确、安全地使用它们。句柄不能执行指针算法,也不能转换成一个空指针或任何其他整数类型,话说回来,依然可使用星号(*)和箭号(->)操作符。

这不是说,你再不能取得一个指向垃圾回收堆中的指针了,在Visual C++ 2005中的pin_ptr,可用于取得托管堆中对象的一个固定指针,只要这个指针存在,对象就被固定在托管堆中,以防止垃圾回收器清除它;Visual C++ 2005同时也引入了“引用跟踪”操作符,以百分号 % 表示。

当年在Visual C++ 2005中引入 & 引用操作符时,大多数开发者把它理解成一个指向对象的指针,而且由编译器自动解引用。在很多方面来说,% 之于 ^,就像 & 之于 *。

相关推荐