脱胎换骨的现代C++有哪些出奇的新特性?

从C++11开始,我们都称之为现代C++。现代C++的新特性皆围绕C++之父Bjarne指明的两条主线:一是直接硬件映射,二是零开销抽象。这也正好体现了C++的蜕变方向:更快、更好用。


【从C++98到现代C++】

要聊现代C++,还得从C++的发展历程说起:
▪ 1998年,C++标准委员会发布了C++语言的第一个国际标准,也就是我们现在使用的最多的C++98;
▪ 2003年,标准委员会针对98版本中存在的诸多问题进行了修订,修订后发布了C++03;
▪ 2005年,C++标准委员会发布了一份技术报告,详细说明了引入C++新特性的计划。因为当时预计会在本世纪第一个十年的某个时间发布,这个新标准被非正式地命名为C++0x。但是,这个标准最终在2011年才面世,也就是C++11,此次标准为C++98发布后13年来的第一次重大修正;
▪ 2014年,标准委员会公布了C++14标准;
▪ 2017年,标准委员会计划即将公布的C++17标准。
 

从C++11开始,我们都称之为现代C++。在C++通过演变来发展其定义的过程中,偶尔引发过与现有代码的兼容问题。不过根据Bjarne Stroustrup表示,新的标准将几乎100%兼容于现有标准。



【现代C++有哪些新威力?】
▪ 智能指针

“智能指针”使我们不用再担心内存管理的问题。对于C/C++程序员来说,指针是天堂,同时指针也是地狱。指针有很多好处,也有很多让人头疼的问题:野指针、内存泄露等等。


在C++11中,引入了如下三种智能指针:unique_ptr、shared_ptr和weak_ptr。这3种指针组件就是采用了boost里的智能指针方案,C++11将boost里的这一套纳入了标准。

▪ lambda表达式
“lambda表达式”让我们的算法更加清晰。C++11添加了一项名为lambda表达式的新功能,通过这项功能可以编写内嵌的匿名函数,而不必编写独立函数和函数对象,使得代码更容易理解。


▪ 类型推导
“类型推导”不仅让我们写代码更加简洁还让推断模板函数的返回类型更加便利。C++11中引入auto 和 decltype这两个关键字,auto能让编译器替我们去分析表达式所属的类型,decltype的作用是选择并返回操作数的数据类型。

如:


 这样使用最明显的好处就是在使用迭代器遍历STL容器的时候,不用去声明那些迭代器的类型,也不用去使用typedef就能很简洁的实现遍历了。


从效率上来说,auto不会对运行时效率产生影响,它是在编译的时候推导类型的,例如上面的代码,编译的时候,就会把num变量转换为int类型。 


有的时候我们还会遇到这种情况,我们希望从表达式中推断出要定义变量的类型,但却不想用表达式的值去初始化变量。还有可能是函数的返回类型为某表达式的值类型。


在这些时候auto显得就无力了,所以C++11又引入了第二种类型说明符decltype,它的作用是选择并返回操作数的数据类型。在此过程中,编译器只是分析表达式并得到它的类型,却不进行实际的计算表达式的值。

在这里编译器并不实际调用f函数,而是分析f函数的返回值作为sum的定义类型。


▪ 基于范围的for循环
“基于范围的for循环”使得按顺序访问其中的每个元素变得非常方便。


【在更快用方面有哪些改进?】

▪ 线程库
“线程库”让我们能方便地编写出 可移植的并发程序, 并且创建和启动一个C++线程变得非常简便。

▪ 右值引用和转移语义
“右值引用和转移语义”可以避免无谓的拷贝,节省运算存储资源,提高效率和程序性能。


C++11增加一个新的非常数引用(reference)类型,称作右值引用(R-value reference),标记为T &&。右值引用所引用的临时对象可以在该临时对象被初始化之后做修改。右值引用是用来支持转移语义的。


转移语义可以将资源 ( 堆,系统对象等 ) 从一个对象转移到另一个对象,这样能够减少不必要的临时对象的创建、拷贝以及销毁,能够大幅度提高 C++ 应用程序的性能。临时对象的维护 ( 创建和销毁 ) 对性能有严重影响。

转移语义是和拷贝语义相对的,可以类比文件的剪切与拷贝,当我们将文件从一个目录拷贝到另一个目录时,速度比剪切慢很多。通过转移语义,临时对象中的资源能够转移其它的对象里。


▪ 原子类型
“原子类型”可以让我们线程间的数据共享更加方便、安全。


我们知道原子操作就是多线程程序中“最小的且不可并行化的”的操作。通常情况下,原子操作都是通过“互斥”的访问来保证的,如借助POSIX标准的pthread库中的互斥锁mutex可以做到。


在新标准C++11,引入多种原子操作数据类型,例如,atomic_bool,atomic_int等等,如果我们在多个线程中对这些类型的共享资源进行操作,编译器将保证这些操作都是原子性的,也就是说,确保任意时刻只有一个线程对这个资源进行访问,编译器将保证,多个线程访问这个共享资源的正确性。从而避免了锁的使用,提高了效率。


【现代C++的实际应用】

C++11相比C++98来说已经有了脱胎换骨的变化,而且C++仍然在持续发展,充满活力,比如已经出来的C++14和即将到来的C++17,这些是非常值得期待的,C++的发展会越来越好。随着C++新标准的不断发展,引入越来越多的现代编程语言的特性,C++将越来越受欢迎。


现代C++有这么多的优点,就让我们一起去使用、了解它吧。在Windows下,我们常用的Visual Studio 2012就已经支持大部分C++11的特性了,在Linux 下,升级GCC到4.8及以上即可使用C++11的特性了。

转自:http://rdc.hundsun.com/portal/article/678.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值