`
xpp02
  • 浏览: 1006744 次
社区版块
存档分类
最新评论

开始使用C++11的9个理由

 
阅读更多

如果你的代码工作正常并且表现良好,你可能会想知道为什么还要使用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关键字可以自动推断类型,所以下面的代码:

  1. vector<vector<MyType>>::const_iteratorit=v.begin()

现在可以很简单的写成:

  1. autoit=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让你的代码意图更明确。对我来说,减少视觉混乱和代码中能够更清楚地表达我的意图意味着更高兴、更高效。

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

C++ 11提供了一种方法来检查先决条件并尽早的在可能的时机捕获错误-编译过程中,在你运行代码前。这就是理由9

这是通过静态断言(static_assert)和类别属性模版实现的。这种方法的另一个好处是,它不需要占用任何的运行时开销,没有什么性能损失!

现在开始掌握C++ 11

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


分享到:
评论

相关推荐

    C++从零开始---入门教程

    基础概念) C++从零开始(二)——何谓表达式(说明各操作符的用处,但不是全部,剩余的会 在其它文章提到) ...C++从零开始(二十一)——C++样例三(使用VC编写一个通过DLL实现多态性的简 单程序)

    C++开源程序库 C++开源程序库

    Qt实际上使用的并不是标准的C++,而是标准C++的一个扩展。它通过元对象模型扩展,实现了著名的signal/slot机制,而这一机制也成为Qt的最大特色和优势。 与Qt类似的可移植GUI框架还有wxWidget、FOX等。 3、分布式...

    C++之父访谈

    归结个人成功的原因,理由可能有许多,但他只有浅显的两个一点点:他比多数人天真和理想主义那么一点点;比多数人花在解决问题上的时间多一点点。 1979年Bjarne来到美国的新泽西州并加入贝尔实验室,与C语言之父、...

    Google开源项目风格指南 C++ 4.4.5 (2016) 最新中文版

    正如每个 C++ 程序员都知道的, C++ 有很多强大的特性, 但这种强大不可避免的导致它走向复杂,使代码更容易产生 bug, 难以阅读和维护. 本指南的目的是通过详细阐述 C++ 注意事项来驾驭其复杂性. 这些规则在保证代码...

    Linux多线程服务端编程:使用muduo C++网络库

    《Linux多线程服务端编程:使用muduo C++网络库》主要讲述采用现代C++在x86-64 Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread。...

    Visual C++ 范例大全(带书签)高清

    首先从vc/c++的基础入手,按照由易到难、由浅入深的顺序,介绍了使用vc开发windows应用程序的方法,包括消息处理,基本控件的使用,菜单、工具栏和状态栏的开发,屏幕绘图,对话框,文档视图框架,打印、帮助、调试...

    精通Visual.C++指纹模式识别系统算法及实现 (完整版+中文版)pdf 格式

    本资源是以压缩包形式的,里面是一个pdf格式电子书(完整版)。有需要的朋友可以下载。 本书作者: 李昊 傅曦(编著); 本书出版社:人民邮电出版社 内容简介: 《精通VisualC++指纹模式识别系统算法及现实》共5...

    play_findn6u_C++_QT_基于qt的简易播放器_play_

    早上临时决定先做个视频播放器玩一下,于是先用qml发现不会用,无果,于是放弃了使用qml,等之后系统的看一下JavaScript之后再试试qml吧;今天用的是较为传统的C++加ui文件完成,c++算是我的编程母语,用起来更顺手...

    遗传算法解决背包问题(C++版本)【源代码+实验报告+可执行文件】

    遗传算法解决背包问题(C++版本)【源代码+实验报告+可执行文件】 人工智能实验,绝对可以运行,理由详细的注释,方便新手学习。

    二维我的世界源码C++制作

    你们有没有在学编程时想玩我的世界却不能玩?下载这个文档,复制到C++里,可以让你有正当理由来玩我的世界哦!注意!是C++程序,不是C,也不是Python或Go!

    正则表达式的词法分析程序

    (2)打开一个C++源文件,打印出所有以上的记号。 (3)要求应用程序应为Windows界面。 (4)选作部分:为了提高C++源程序的可读性,C++程序在书写过程中加入了空行、空格、缩进、注释等。假设你想牺牲可读性,以...

    accelerate c++

    初学、中学者都适合,如果您在寻找一本c++入手书籍,就它了,别在找其他了。理由:循序渐进、以实际程序讲解新知识,学到新知识同时,也把程序设计思想吸收了。

    FIFO.rar_C++

    最近最少使用页面(FIFO)置换算法,是最简单的页面置换算法。这种算法的基本思想是:当需要淘汰一个页面时,总是选择驻留主存时间最长的页面进行淘汰,即先进入...其理由是:最早调入主存的页面不再被使用的可能性最大。

    RandomForestPlusPlus:我的随机森林代码的 C++ 实现

    结构这是一个 XCode 项目,没有更好的理由,因为我是唯一的开发人员,而 XCode 是我得心应手的。 希望它可以在其他环境中轻松构建,但尚未设置或测试。目标RandomForest++ - 主要可执行文件。 针对所有库构建和链接...

    C++如何动态的生成对象详解

    有时候开发真是有些矛盾,例如:1、实现一个功能可以使用大量相似的代码、也可以使用模板,那我们怎么选择呢? 2、如果实现一个类之后,他有大量的属性,而且这些属性都需要set和get方法,那么我们还是要Ctrl +C和...

    c++ 面向对象的类设计

    多了,就显得冗余,累赘,当然特例下,允许少许的重复,但是,这里必须要有很好的理由。冗余往往就意味着包含了过多的信息,概念的表达不够精准,好比goto,指针,多继承这些货色,就是因为其过多的内涵,才要严格...

    json-rpc的C ++框架(json远程过程调用)-C/C++开发

    在下一个RPC项目中使用libjson-rpc-cpp的5个很好的理由libjson-rpc-cpp此框​​架为C ++提供跨平台的JSON-RPC(远程过程调用)支持。 它与JSON-RPC 2.0和1.0完全兼容。 在您的下一个RPC项目中使用libjson-rpc-cpp的5...

    concurrentqueue:C ++ 11的快速多生产者,多消费者,无锁的并发队列

    moodycamel :: ConcurrentQueue C ++的工业级无锁队列。 注意:如果您需要的只是...使用理由 对于C ++,没有那么多成熟的无锁队列。 Boost有一个,但仅限于具有琐碎的赋值运算符和琐碎的析构函数的对象。 英特尔的TBB

    编程思想E:\编程\C++\参考文档

    编程思想在校7年由于资质愚钝及专业、条件、或许还有恋爱等限制,什么也未学到...这里找诸多理由也就是给自己找个借口罢了,相信是金子终究会发光,革命尚未成功,因此诸君在校多努力啊!,不过读博士什么的还请慎重。

    C++中的内存分区介绍

    C++的内存划分为栈区、堆区、全局区/静态区、字符串常量和代码区。 这里去掉自由存储区,增加了代码区,理由会在下面讲到。 栈区:由系统进行内存的管理。 说明:主要存放函数的参数以及局部变量。栈区由系统进行...

Global site tag (gtag.js) - Google Analytics