阅读更多

4顶
3踩

编程语言

转载新闻 开始使用 C++11 的 9 个理由

2012-05-14 16:05 by 副主编 MnouW 评论(9) 有7669人浏览
C++ 11是C++编程语言的新标准,它将取代现行的C++标准ISO/IEC 14882。新的标准包含核心语言的新功能,而且扩展了C++标准库。

但是,如果代码工作正常并且表现良好,为什么还要使用C++ 11呢?当然了,使用最新的技术感觉很好,但是事实上它是否值得呢?

在我看来,答案毫无疑问是肯定的。我在下面给出了9个理由,主要分为两类:性能优势和开发效率。

获得性能优势

理由1:move语义(move semantics)。简单的说,它是优化复制的一种方式。

有时候复制很显然是浪费的。如果你从一个临时的string对象复制内容,简单的复制指针到字符缓冲区将比创建一个新的缓冲区再复制要高效得多。之所以能工作是因为源对象超出了范围。

然而,在这以前C++并没有判断源对象是不是临时对象的机制。move语义通过除了复制操作外还允许你有一个move构造函数(move constructor)和一个move赋值运算(move assignment)符来提供这个机制。

当你在Visual Studio 2010中使用标准库中的类如string或vector时,它们已经支持move语义了。这可以防止不必要的的复制,从而改善性能。

通过在你的类中实现move语义你可以获得额外的性能提升,比如当你把它们存储到STL容器中时。还有,move语义不仅可以应用到构造函数,还可以应用到方法(如vector的push_back方法)。

理由2:通过使用类别属性(type traits,如is_floating_point)和模板元编程(template metaprogramming,如enable_if template),你可以为某些特定的类型定制模版,这可以实现优化。

理由3:哈希表现在已经是标准实现了,它提供更快速的插入、删除和查找,这在处理大量数据时很有用。你现在可以随便使用unordered_map、unordered_multimap、unordered_set 和unordered_multiset这几种数据结构了。

提高效率

提高效率不仅都是在代码性能方面,开发时间也是宝贵的。C++ 11可以让你的代码更短、更清晰、和更易于阅读,这可以让你的效率更高。

理由4:auto关键字可以自动推断类型,所以下面的代码:

vector<vector<MyType>>::const_iterator it = v.begin()


现在可以很简单的写成:

auto it = v.cbegin()


尽管有些人会说,它隐藏了类型信息,在我看来它利大于弊,因为它减少了视觉混乱并展示了代码的行为,还有它可以让开发者少打很多字!

理由5:Lambda表达式提供了一种方法来定义匿名方法对象(实际上是闭包),这是代码更加线性和有规律可循。这在和STL算法结合使用时很方便:

bool is_fuel_level_safe()
{
return all_of(_tanks.begin(), _tanks.end(), 
[this](Tank& t) { return t.fuel_level() > _min_fuel_level; });
}


理由6:新的智能指针(smart pointer)替换了有问题的auto_ptr,你可以不用担心内存的释放并移除相关释放内存的代码了。这让代码更清晰,并杜绝了内存泄露和查找内存泄露的时间。

理由7:把方法作为first class object是一个非常强大的特性,这让你的代码变得更灵活和通用了。C++的std::function提供了这方面的功能。方法提供一种包装和传递任何可调用的东西,如函数指针、仿函数(functor)、lambda表达式等。

理由8:还有许多其它小的功能,如override、final关键字和nullptr让你的代码意图更明确。对我来说,减少视觉混乱和代码中能够更清楚地表达我的意图,意味着更高效。

理由9:另一个影响开发效率的因素是错误检测。如果你的错误在运行时发生,这意味着你至少需要运行软件,并可能得通过一系列步骤来重现错误,这需要时间。

C++ 11提供了一种方法来检查先决条件并尽早的在可能的时机捕获错误。这是通过静态断言(static_assert)和类别属性模版实现的。这种方法的另一个好处是,它不需要占用任何的运行时开销,没有什么性能损失!

现在开始掌握C++ 11

在C++ 11标准中除了上面描述的特性外,还有更多的改动和新功能。不过,我相信它们是值得你花时间去学习的。你将省去以往花在提高效率上的时间。很多主流的编译器已经开始支持C++ 11的一些标准了。还等什么?开始吧!

4
3
评论 共 9 条 请登录后发表评论
9 楼 tomqyp 2012-05-16 10:12
动态语言越用越爽,看到这些就更不想去碰C++了
8 楼 易卡螺丝君 2012-05-15 08:49
给机翻党神作跪了
7 楼 ray_linn 2012-05-15 07:52
这个翻译怎么如此臭不可闻
6 楼 bbeikke 2012-05-14 22:38
C++ Primer第五版:
Completely Rewritten for the New C++11 Standard
http://www.amazon.com/Primer-5th-Edition-Stanley-Lippman/dp/0321714113
5 楼 gfdice 2012-05-14 21:14
"当你在Visual Studio 2010中使用标准库中的类如string或vector时,它们已经支持move语义了。这可以防止不必要的的复制,从而改善性能。"
bullsh*t, the implementation in vs2010 is crippled, methods such as emplace-back does nothing more than old-fashioned push-bach. u can only use kid stuff like "auto" in vs2010
4 楼 yanbo 2012-05-14 18:59
    
3 楼 phlsbg 2012-05-14 18:37
估计C++世界开始用这些新特性要到10以后。
Java时间中的新特性推广都这么慢,就别说C++了。。。
2 楼 manatees 2012-05-14 18:03
1 楼 eisenwolf 2012-05-14 16:41

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 使用Tinyxml库保存文件saveFile时一直失败,系统版本问题导致

    功能:想把一些内容存储到xml文件中,但是在savefile时,返回值一直=0. 想要 使用内部函数,打印错误描述。但是,结果和我想的结果有偏差。打不出错误描述来!!! 猜测方案: 1:在使用该库时,用的lib库版本不对?验证后排出可能 2:在每段代码后,打印log,查看输出。也没发现特殊返回值 有个特别之处:在win7的电脑上是可以存储成功的,但是,在win10上一直都保存不成功...

  • MXML保存时格式化XML详细

    参考:https://blog.csdn.net/whymewuxian/article/details/16866489?utm_source=blogxgwz7 https://blog.csdn.net/zerolity/article/details/70892705?utm_source=blogxgwz6 关于格式化XML文件,主要通过四个参数MXML_WS_...

  • C语言操作xml文件的学习总结

    下载并安装libxml2 下载地址:ftp://xmlsoft.org/libxml2/ 下载最新的版本,我下载的是libxml2-2.9.1.tar.gz。下载后将文件解压到合适的位置,进入解压后的目录。 编译命令非常简单(注意:如果configure文件没有可执行权限,增加可执行权限): ./configure make make install 此时libxml2相关的头文件应

  • libxml2如何解析xml格式的字符串

    1.     xmlParseMemory,字符串转为XML文档 2.     xmlDocGetRootElement,获取XML文档根节点 3.     xmlStrcmp,比较XML字符串,与strcmp差不多 4.     curr = curr->xmlChildrenNode,XML节点指针指向第一个子节点 5.     curr = curr->next,XM

  • 富文本编辑器复制公式上传

    1.4.2之后官方并没有做功能的改动,1.4.2在word复制这块没有bug,其他版本会出现手动无法转存的情况 本文使用的后台是Java。前端为Jsp(前端都一样,后台如果语言不通得自己做 Base64编码解码) 因为公司业务需要支持IE8 ,网上其实有很多富文本框,效果都很好。 例如www.wangEditor.com 但试了一圈都不支持IE8 。 所以回到Ueditor,由于官方没有维护,新的neuditor 也不知道什么时候能支持word自动转存,只能自己想办法。 如果没有必要,不建议使用.

  • IE如何实现文件的自动下载

    function DownLoadPDF(attachGuid, filename,filepath) { var fso = new ActiveXObject(&quot;Scripting.FileSystemObject&quot;); if (!fso.FolderExists(filepath)) { fso.CreateFolder(filepath); } ...

  • VBS之adodb.stream对象的方法/属性

    adodb.stream对象的方法/属性 Cancel 方法 使用方法如下 Object.Cancel 说明:取消执行挂起的异步 Execute 或 Open 方法的调用。 Close 方法 使用方法如下 Object.Close :关闭对像 CopyTo 方法 使用方法如下 Object.CopyTo(destStream,[CharNumber]

  • 使用XmlDocument的Save方法容易出错的问题

    来源:uuBox.net 开发日记  http://www.cnblogs.com/uubox/archive/2007/12/16/996694.html在使用XmlDocument的Save方法将内容保存到一个XML文件时,有时会发现保存后得到的XML文档会解析不了,并显示“XML只能存在一个根节点”的错误,用记事本打开XML文档看会发现XML文档的末尾会多出几行多余的文本。特别是对Xml

  • Save XML file to local system

     Off course, this operation need user’s permission, but when I using xml_dom_obj.save(), nothing happened, even a permission requesting dialog.I donot know if it was blocked by my IE browser or th

  • adodb.Stream 详细用法

     组件:"Adodb.Stream"有下列方法:Cancel 方法     使用方法如下     Object.Cancel     说明:取消执行挂起的异步 Execute 或 Open 方法的调用。Close  方法     使用方法如下     Object.Close     :关闭对像CopyTo 方法     使用方法如下     Object.CopyTo(destStream

  • 使用XML帮助上传文件

    作者 Marco Nanni 概述    本文讲解了一个使用XML技术上传文件的例子,使用该方法没有传统方法中的种种限制。 这个例子讲述了如何使用MSXML3.0和ADO Stream对象来实现这种新的上传方法。好处有很多,比如,不需要专用的上传组件。 引言    为了在HTML网页中获得上传功能,在客户端我们可以使用如下格式的FORM:   ACTION="TargetURL

  • saveFile()方法

    saveFile的原理就是将流写入到需要写入的文件,通过可以用“FileOutputStream”创建文件实例,之后过“OutputStreamWriter”流的形式进行存储,举例:public void saveFile( ){OutputStreamWriter pw = null;//定义一个流pw = new OutputStreamWriter(new FileOutputStream(...

  • xml文件的解析

    1. Libxml2中的数据类型和函数 一个函数库中可能有几百种数据类型以及几千个函数,但是记住大师的话,90%的功能都是由30%的内容提供的。对于libxml2,我认为搞懂以下的数据类型和函数就足够了。 1.1   内部字符类型xmlChar xmlChar是Libxml2中的字符类型,库中所有字符、字符串都是基于这个数据类型。事实上它的定义是:xmlstring.h typed

  • xmlhttp,adodb.stream 结合整理 ——代码转换效率问题

    xmlhttp,adodb.stream 结合整理                                                                                                        ——代码转换效率问题说明:xmlHttp组件的详细参考文档可以在我的另一篇文章中找到,也可以登录到我            个人的blog网站

  • linux c 使用libxml2 读写xml格式配置文件

    linux c使用libxml2读取配置文件  Libxml2是个C语言的XML程式库,能简单方便的提供对XML文件的各种操作,并且支持XPATH查询,及部分的支持XSLT转换等功能。完全版的库是开源的,并且带有例子程式和说明文件。 libxml2的安装   yum install libxml2 libxml2-devel -y 或者 #sudo apt-get install li...

  • VB6 RecordSet与XML转换

    Public Function SaveRSToXML(ByVal ConnectionString As String, ByVal strSQL As String) As String Dim oCn As New ADODB.Connection Dim oRs As New ADODB.Recordset Dim oStream As New ADODB.Stre

  • 利用XSLT把ADO记录集转换成XML

    利用XSLT把ADO记录集转换成XML孟宪会 由于XML(可扩展标记语言:eXtensible Markup Language)真正的平台无关性,它正在逐渐成为数据传输的主要介质。XML是一种自描述的语言,数据本身就已经包含了元数据,即关于数据本身的信息。例如:“孟子E章1757281793923net_lover1807581793923”这组数据,从字面很难看出它代表什么意思,也不清楚

  • ASP使用xmlhttp和Adodb.Stream保存远程文件到本地

    主要介绍了xmlhttp的使用方法,结合Adodb.Stream下载远程的文件,已经分别写入了函数,只需要调用函数就可以了,使用简单,方便。Function SaveRemoteFile(LocalFileName,RemoteFileUrl)    SaveRemoteFile=Truedim Ads,Retrieval,GetRemoteDataSet Retrieval = Server.

Global site tag (gtag.js) - Google Analytics