C++/CLI的初感受

第一眼看到C++/CLI的介绍的时候,只是听说,这是变得很厉害的一个东东,不仅是因为功能变得很强,而且是因为基本上重写了Visual Studio.NET中的C++。那不管怎么样,只有仔细看看,才能做出判断。

1. 其实,仔细看看,底层是不怎么动的,该得比较厉害的,就是具体的语法了。Visual Studio.NET 2001/2003中的C++ (Managed C++) 语法太别扭了,所以他们差不多重写了一次。例如,一个很大的变化是__gc new到gcnew。

我们知道计算机的内存中有栈(Stack)和堆(Heap),在程序的函数中的一些本地变量,一些寄存器值,都是存放在栈(Stack)中的。而当我们使用new (C++)来创建一个新的对象时,就会被分配到堆(Heap)中,当我们不再需要了,就使用delete (C++)来删除。这样,效率非常高。但会导致:

1) 忘记删除,导致内存泄漏。

2) 重复删除,导致程序崩溃。

所以,.NET使用了垃圾回收,我们在C#和VB.NET中,都不需要使用delete,.NET会自动删除不再需要的空间。但在C++这样高级的语言(其实是需要调用底层代码)中,就要区分,在创建对象的时候,是放在.NET控制的Heap上,还是传统的Heap上。

在Managed C++中,这里的语法太丑陋,是这样的:

IO::MemoryStream __gc* heapObject = __gc new IO::MemoryStream;

而在C++/CLI中,变为:

IO::MemoryStream^ heapObject = gcnew IO::MemoryStream;

这样语法更自然了。但多了一个操作符: ^,用来声明一个用作CLR指针类型的变量,其实也就是一个指针,只不过是C++/CLI中,指向.NET Heap中的对象的指针。

2. 析构函数的变化。

C++/CLI中,析构函数是这样的:

ref class test

{

protected: ~test()

     {

     }

protected: !test()

     {

     }

};

其中,~test()实现了IDisposable::Dispose方法,会把managed和unmanaged资源释放;而!test()实现了Object::Finalize方法,会把unmanaged资源释放。

由于水平限制,一下子解析不清楚IDisposable::Dispose,可以参考“资料”中的信息。

3. 同时,还有一些像Boxing,属性,Delegate方面的改进。

总的来说,C++/CLI确实比起Managed C++来说,语法更自然。但是C++/CLI是标准C++的一个扩展,问题就是到时候大家是不是接受C++/CLI呢?毕竟^这样的符号,看着还是有些别扭……

资料:

C++/CLI Standard

https://msdn.microsoft.com/visualc/homepageheadlines/ecma/

C++: The Most Powerful Language for .NET Framework Programming

https://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvs05/html/VS05Cplus.asp