推荐使用C++ 11

如果你的代码工作正常并且表现良好,你可能会想知道为什么还要使用C++11。当然了,使用用最新的技术感觉很好,但是事实上它是否值得呢? 在我看来,答案毫无疑问是肯定的。我在下面给出了9个理由

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

如果你的代码工作正常并且表现良好,你可能会想知道为什么还要使用C++ 11。当然了,使用用最新的技术感觉很好,但是事实上它是否值得呢? 在我看来,答案毫无疑问是肯定的。我在下面给出了9个理由,它们分为两类:性能优势和开发效率。

获得性能优势

理由1:move语义(move semantics)。简单的说,它是优化复制的一种方式。有时候复制很显然是浪费的。如果你从一个临时的string对象复制内容,简单的复制指针到字符缓冲区将比创建一个新的缓冲区再复制要高效得多。他之所以能工作是因为源对象超出了范围。

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

你知道吗?当你在Visual Studio 2010中使用标准库中的类如string或vector时,它们已经支持move语义了。这可以防止不必要的的复制从而改善性能。http://hovertree.com/menu/visualstudio/

通过在你的类中实现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() 

// 何问起 hovertree.com

现在可以很简单的写成:

auto it = v.cbegin() 

// 何问起 hovertree.com

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

理由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; });  
}  
// 何问起 hovertree.com

理由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的一些标准了。还等什么?开始吧!

推荐: http://www.cnblogs.com/roucheng/p/3456005.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120544.html原文链接:https://javaforall.net

(0)
上一篇 2021年12月23日 下午11:00
下一篇 2021年12月23日 下午11:00


相关推荐

  • 腾讯云的ssl免费证书申请_腾讯云认证证书

    腾讯云的ssl免费证书申请_腾讯云认证证书前提条件:域名是在在腾讯云上购买的1.购买SSL证书1.1登录腾讯云状态下,打开链接https://console.cloud.tencent.com/ssl1.2在证书列表上方点击“申请免费证书”按钮,然后直接点“确定”1.3根据提示填写相关信息,“下一步”1.4选用“自动DNS验证”,“确认申请”1.5等待证书颁发即可,一般1…

    2025年10月15日
    5
  • tomcat部署war包访问显示404

    tomcat部署war包访问显示404在eclipse导出的maven项目war包,放到tomcat下启动,顺利启动且无报错,但是浏览器访问该项目时显示404原因:未在server.xml中配置这几个项目,导致服务器查找不到解决方法:&lt;HostappBase="webapps"autoDeploy="true"name="localhost"unpackWARs="true"&gt;…

    2022年6月10日
    220
  • 图片加载失败显示默认图片

    图片加载失败显示默认图片在页面加载的图片的时候,如果图片不存在或者路径不存在,页面加载图片就会如下图所示。解决方法:在img标签中添加一下标签onerror=”onerror=null;src=’img/a3.jpg'”src中写默认图片地址即可

    2022年5月5日
    187
  • pycharm汉化包

    pycharm汉化包更新一个pycharm汉化包,下面给出具体炒作流程1.解压压缩包,里面一共有两个东西第一个文件夹是汉化的所有文件,(简单的说就是第二个文件解压后的文件,不过第二个文件本身并不是压缩包,只是可以用解压的方式打开而已)2.解压以后,将resources_cn复制,粘贴到pycharm的lib目录下,具体目录如下图3.将resources_cn粘贴到这个目录下…

    2022年5月9日
    56
  • 微信小程序完整项目实战(前端+后端)

    微信小程序完整项目实战(前端+后端)基于微信小程序的在线商城系统 采用前后端分离的模式 使用 C 作为后端语言进行开发 界面完整 上手简单

    2026年3月18日
    2
  • C++单向链表_C语言定义链表

    C++单向链表_C语言定义链表(C/C++)初识单向链表第一次写博客,如果写得不好请谅解,欢迎大佬们一起交流讨论。在我初学链表的时候,会觉得书上讲解十分抽象,理解到头炸,在通过做题的方式后,对链表又产生了新的认识和看法,使用链表的方式更加灵活了,通过这篇文章与大家分享一下单向链表的一些知识。本文章主要讲单向链表:-创建-输出-排序-插入-删除-清空

    2025年7月9日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号