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的定义如下:
另外,在这段代码里面,除了上述的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这两个接口函数的实现一致,看下面的代码。
这段简短的代码的执行步奏:
首先为创建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、并发
想看看下面一段代码:
这段代码只是将一块新分配的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
在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
相关文章推荐
- Spring Boot 2.0正式发布,新特性解读
- mongodb4.0事务特性(解读)
- MySQL 5.7 新特性解读
- 《Oracle 12c特性解读-容器数据库和灾备》金牌客座讲师主讲,进阶高级DBA必修
- 解读上海远丰MallBuilder商城系统的功能特性
- 全面解读Objective-C语言及Cocoa特性——《Objective-C基础教程》
- C# 4.0四大新特性代码示例与解读
- 另类解读C语言数组的特性
- 解读 Oracle 12c 的 12 个新特性
- Python cx_Oracle 5.0 新特性概述
- 国内十家OA办公系统厂商的特性解读
- 解读Tom介绍的Oracle Database 12c的12个新特性
- java8特性深入解读文章合集
- 深入解读ADO.NET2.0的十大最新特性
- C# 4.0四大新特性代码示例与解读
- ACE框架解读 - 特性篇
- 由Map的新特性解读一段代码
- 深入解读ADO.NET2.0的十大最新特性
- 专家解读Linux操作系统内核中的GCC特性
- 深度:VMware VSAN 6.0性能特性解读