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

开发 后端
对于微软推出的Visual C++ 2005编译器的成功面世,就令无数C++语言爱好者对此垂涎不已;它与ISO C++标准保持98%的一致——这比以前任何一个版本都更加接近。

微软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模式,可提供本地与托管代码的无缝融合。#t#

相对于前两个版本,新编译器还包括了一个增强版本的缓冲区安全检查选项,而且对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中引入 & 引用操作符时,大多数开发者把它理解成一个指向对象的指针,而且由编译器自动解引用。在很多方面来说,% 之于 ^,就像 & 之于 *。

在托管世界中,对托管对象的本地引用,与指向托管对象的本地指针一样危险,指针和引用的基本原理在于,被引用的对象不能四处移动。引用跟踪与本地引用非常类似。

除了它引用的对象是在托管堆中,而且被垃圾回收器移动之后,还能继续跟踪它们。百分号 % 操作符用来取托管对象的地址,就像 & 操作符对于本地对象的功能一样,百分号 % 操作符可返回一个托管引用类型对象的句柄。

责任编辑:chenqingxiang 来源: NET130
相关推荐

2010-01-15 16:37:28

Visual C++

2009-01-12 10:16:11

Visual C++编译器选项设置

2010-01-12 14:22:26

Visual C++

2010-01-22 16:55:52

C++编译器

2010-01-13 17:12:26

C++编译器

2010-01-18 10:34:21

C++编译器

2013-03-18 09:42:47

C++C++ 11

2010-01-21 09:11:38

C++编译器

2015-03-23 10:04:43

c++编译器c++实现原理总结

2010-01-11 11:02:59

Visual C++

2010-01-08 16:00:46

C++编译器

2009-11-30 17:20:34

Visual Stui

2010-01-18 10:28:15

C++编译器

2010-10-20 13:43:37

C++编译器

2010-02-03 13:14:03

C++编译器命令

2010-01-14 15:29:44

C++编译器

2010-01-12 16:42:59

C++编译器

2010-01-27 16:39:48

C++编译器

2010-01-21 09:26:53

CC++编译器

2010-01-15 17:18:57

C++源程序
点赞
收藏

51CTO技术栈公众号