开始使用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_iterator it = v.begin() 

现在可以很简单的写成:

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

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

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

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

现在开始掌握C++ 11

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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/451127.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL批量update数据(更新的数据值不同)

(一)纯mysql: ​UPDATE my_table SETstatus CASE idWHEN 1 THEN 3WHEN 2 THEN 4WHEN 3 THEN 5END,title CASE idWHEN 1 THEN New Title 1WHEN 2 THEN New Title 2WHEN 3 THEN New Title 3END WHERE id IN (1,2,3) (二)mybatis写法 1:foreach <update id"batchUpd…

webpack+vue-cli 中proxyTable配置接口地址代理

在项目开发的时候&#xff0c;接口联调的时候一般都是同域名下&#xff0c;且不存在跨域的情况下进行接口联调&#xff0c;但是当我们现在使用vue-cli进行项目打包的时候&#xff0c;我们在本地启动服务器后&#xff0c;比如本地开发服务下是 http://localhost:8080 这样的访问…

AMQP 协议介绍

RabbitMQ 是遵从AMQP 协议的&#xff0c; 换句话说&#xff0c; RabbitMQ 就是AMQP 协议的Erlang 的实现(当然RabbitMQ 还支持STOMP2 、MQTT3 等协议) 0 AMQP 的模型架构和RabbitMQ 的模型架构是一样的&#xff0c;生产者将消息发送给交换器&#xff0c;交换器和队列绑定。当生…

关联表多数据的批量insert (批量导入,测试19W条数据用时46秒)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 一、业务需求 &#xff1a;作多个批量导入 &#xff0c;根据业务不同&#xff0c;每条数据导入前作各种验证&#xff0c; 导入后提示验证…

Java已死?九百万程序员说不

Java没死&#xff0c;事实上它拥有足够的能量让你的应用跑起来。那些对Java吹毛求疵人频繁地聚焦在一些小众问题上&#xff0c;总是和其他技术或者语言做些不公平的对比&#xff0c;这些语言并没有像Java一样得到广泛应用及长远的历史。 现在的小孩都能学Java&#xff0c;它在…

Linux SSH远程管理故障如何排查?

SSH远程管理故障排查方案&#xff1a;1、检测两个机器是否畅通两个机器之间是否畅通&#xff0c;查看物理链路是否有问题(网线网卡、IP是否正确)第1步&#xff1a;物理链路是否畅通&#xff0c;比喻为“高速公路是否畅通”ping 排查客户端到服务端的线路问题&#xff0c;ping是…

CSS中position的absolute和relative用法

static: HTML元素的默认定位方式absolute: 将对象从文档流中拖出&#xff0c;使用left&#xff0c;right&#xff0c;top&#xff0c;bottom等属性进行绝对定位。而其层叠通过z-index属性定义。绝对定位的元素的位置相对于最近的已定位父元素&#xff0c;如果元素没有已定位的父…

Spring HttpMessageNotReadableException异常

&#xff08;一&#xff09;现象 我们在进行服务间的rpc调用时&#xff0c;可能会遇到org.springframework.http.converter.HttpMessageNotReadableException异常。 其具体报错如下&#xff1a; {"timestamp": 1456043810789,"status": 400,"error…

解决 -- java 调用webservice 服务端收到参数为null

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 我的客户端和服务端都写的很简单&#xff0c;只是调用服务的时候&#xff0c; 服务端得不到参数&#xff0c;后来发现只改一个地方就可…

fastJson性能测试

测试装备&#xff1a; mac pro 6核12线程 测试代码&#xff1a; &#xff08;1&#xff09;序列化对象&#xff1a; import lombok.Data;Data public class User {int id;String name;int age;String address; } &#xff08;2&#xff09;序列化逻辑&#xff1a; import…

避免流量高峰期CDN问题的10个方法

在视频流媒体中&#xff0c;因平台火爆而出现问题是件好事。至少&#xff0c;这比根本没有观众要好。\\也许你正在使用世界级的CDN&#xff0c;但是&#xff0c;在大型赛事期间&#xff0c;当CDN的服务器和对等点流量变得饱和的时候&#xff0c;一些用户还是无法享受到流畅的体…

Android应用进入爆发期 手机游戏仍是市场重心

近日&#xff0c;91无线发布了《91无线移动应用发展趋势报告&#xff08;Android版&#xff09;》。报告显示&#xff0c;2012年&#xff0c;无论Android移动应用用户下载还是开发者研发均呈爆发态势&#xff0c;手机游戏仍是市场重心所在。同时&#xff0c;Android移动应用下载…

MQTT Client软件-MQTTBox

最近发现了一个连接mqtt broker的软件&#xff1a;MQTTBox。GitHub地址&#xff1a;https://github.com/workswithweb/MQTTBox 官网网站的介绍为&#xff1a;使用MQTTBox增强你的物联网流程 MQTT客户端特性 支持TCP、TLS、Web Sockets和安全的Web Sockets连接MQTT服务器支持各种…

fastJson toJSONString注意点

fastJosn是阿里爸爸推出一款高性能序列化工具&#xff0c;号称最快的json序列化工具。不过好像也就那样&#xff0c;在量比较大的时候优势才会明显。单次序列化时间还是会达到几十毫秒的级别。 Fastjson is a Java library that can be used to convert Java Objects into the…

WebService中文件传输

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 WebService处理传递普通的信息&#xff0c;还可以传输文件&#xff0c;下面介绍WebService是怎么完成文件传输的。 1、 首先编写服务器端…

Django框架-Form组件

一、DjangoForm组件介绍 我们之前在html页面中利用form表单向后端提交数据时&#xff0c;都会写一些获取用户输入的标签并且用form标签把它们包起来。 与此同时我们在好多场景下都需要对用户的输入做校验&#xff0c;比如验证用户是否输入&#xff0c;输入的长度和格式等是否正…

中国经济转型知易行难

摘要&#xff1a;一个亚洲国家正在崛起&#xff0c;出口机器势不可挡&#xff0c;财富快速增长&#xff0c;觉得美国已是过去&#xff0c;自己的时代已经到来。这是2012年的中国&#xff1f;没错———但也是上世纪80年代的日本。 美国《芝加哥论坛报》网站5月20日文章&#xf…

进程和线程的剖析

进程和线程的区别&#xff1f;什么时候用进程&#xff1f;什么时候用线程&#xff1f; 答&#xff1a;首先得知道什么是进程什么是线程&#xff1f; 我的理解是进程是指在系统中正在运行的一个应用程序&#xff1b;程序一旦运行就是进程&#xff0c;或者更专业化来说&#xff1…

解决 java.net.ConnectException: Connection refused: connect 异常

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 一、 我的情况很简单&#xff1a; 只是因为我调用服务端接口方法包名没有写对&#xff0c;应该如下面代码中这样写&#xff1a; call.…

主席树的各类模板(区间第k大数【动,静】,区间不同数的个数,区间=k的个数)...

取板粗 好东西来的 1.&#xff08;HDOJ2665&#xff09;http://acm.hdu.edu.cn/showproblem.php?pid2665 &#xff08;POJ2104&#xff09;http://poj.org/problem?id2104 &#xff08;POJ2761&#xff09;http://poj.org/problem?id2761 题意&#xff1a;求区间第K大&…