您的位置:首页 > 编程语言 > C语言/C++

C++/CX特性解读

2012-11-18 12:38 435 查看
C++/CX是微软在2011的Build大会上提出的一套新的API模型。是microsoft为了更好的支持Windows Runtime而提出的新型C++语音扩展。它在所有平台上都能完美的支持刚刚提出的C++11标准。Visual Studio 2012支持C++/CX的编译。
在C++/CX中添加了很多新的语法,如ref等,之前了解过C++/CL的可能会发现,在语法使用上C++/CX与C++/CL之间有很多的相似之处。但这只是表面上的相同,其实这两者在底层上的实现是完全不一样的。C++/CL不想C++/CL那样有一个GC来管理内存,内存由开发者自己去管理,另外,C++/CX在编译后生成的是native代码,不管是在x86,x64还是arm平台。这些特点对C++开发者来说应该是福音。
下面介绍介绍C++/CX的几个新特性吧。
1、ref。ref是一个引用类型,Windows Runtime是基于com的,这个引用类型和com里面引用类型的一种实现,ref的定义如下:

public ref class Number sealed
{
public:
Number() : _value(0) { }
int GetValue()           { return _value;  }
void SetValue(int value) { _value = value; }
private:
int _value;
};


另外,在这段代码里面,除了上述的ref为,还有一个sealed的关键字,这个关键字的意义就是说这个类不能被继承,这个关键字在WinRT中使用的很频繁,大多数的WinRT类型都是 sealed 类。
更多详细介绍请参考Ref classes and structs (C++/CX)

2、hat(^)。“^”在上面的代码中已经出现过,这里在对其做一个详细的介绍。
这个处理object的操作符“^”(你可以叫它hat)是基于智能指针的实现方式的。当这个指针被赋值为nullptr时会将其指向的object自动销毁,而无需再去手动delete。 “^”在WinRT中有两个用途:1、自动管理WinRT Object的生命周期;2、提供WinRT Object的自动类型装换。
自动管理生命周期:这一步的实现和com中的AddRef和Release这两个接口函数的实现一致,看下面的代码。
{
T^ t0 = ref new A();
T^ t1 = ref new B();

t0 = t1;
t0 = nullptr;
}


这段简短的代码的执行步奏:
首先为创建A对象并用t0来管理它、同样的,再创建对象B并用t1来管理它,这两个对象的引用计数都是1;
接下来在执行t0=t1的时候会先为B对象增加一个引用计数,再将A对象的引用计数减1,变为零后直接释放,然后再将t0指向B对象;
执行t0 = nullptr,会执行到t0->Release(),再将B对象的引用计数减1。
类型装换:

3、ref的构造:

使用ref new 动态分配一个ref类:
Number ^ myNum= ref new Number ();
ref new的使用和传统C++中的new是很相似的,基本就是通过使用已有参数构造出一个对象,并赋值给一个指针或者T^管理。不过使用ref new是更加安全的,从这点上说,ref new和shared_ptr的安全构造函数make_shared更相似。
ref也同样能够进行赋值:
Number ^ myNum1 = myNum;
这只是一个指针的简单赋值,他们指向的还是同样的内存区域。

4、并发
想看看下面一段代码:
IRandomAccessStream^ writeOutStream =ref new InMemoryRandomAccessStream();
DataWriter^ datawriter = ref new DataWriter(writeOutStream->GetOutputStreamAt(0));
BYTE *pEncodeDesData = new BYTE[1024];
Platform::Array<BYTE>^ arrData = ref new Platform::Array<BYTE>(pEncodeDesData, 1024);

datawriter->WriteBytes(arrData);

concurrency::task<unsigned int>(datawriter->StoreAsync()).then(
[this, pEncodeDesData]( unsigned int BytesWritten )
{
delete [] pEncodeDesData;
});


这段代码只是将一块新分配的1024个字节的空内容写到了一个内存流中,只不过它是用的一种异步的方式写的。concurrency::task().then就是C++/CX中存在的一种新的并发方式。
在上述代码中datawriter->StoreAsync()时一个异步函数,异步函数执行完成后会接着执行{}中的内容,我们可以将{}中的内容看做是在另外一个函数中执行的代码。BytesWritten 是异步函数执行完成之后返回的数据。 [this, pEncodeDesData]中做的则是一个参数传递类似于一个函数参数。
整个异步执行的流程基本就是如此,在C++/CX中执行一个异步操作也变得非常的简单了。

拓展阅读:
Visual C++ Team Blog介绍C++/CX的一系列文章:

http://blogs.msdn.com/b/vcblog/archive/2012/08/29/cxxcxpart00anintroduction.aspx

Inside the C++/CX Design
http://blogs.msdn.com/b/vcblog/archive/2011/10/20/10228473.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: