9 个开始使用 C++11 的理由 - 开源中国社区
9 个开始使用 C++11 的理由
tsl0922 2012年05月14日

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

tsl0922 tsl0922 发布于2012年05月14日 收藏 43 评论 42

有免费的MySQL,为什么还要买? >>>  

如果你的代码工作正常并且表现良好,你可能会想知道为什么还要使用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让你的代码意图更明确。对我来说,减少视觉混乱和代码中能够更清楚地表达我的意图意味着更高兴、更高效。

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

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

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

现在开始掌握C++ 11

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

注:很多名词觉得翻译成了中文还不如看英文来的舒服,翻译成了中文的后面括号里备注了原英文单词。

原文链接/OsChina.NET编译

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。
转载请注明:文章转载自 开源中国社区 [http://www.oschina.net]
本文标题:9 个开始使用 C++11 的理由
分享
评论(42)
最新评论
0

引用来自“zhj444”的评论

引用来自“Nemesis_E”的评论

引用来自“zhj444”的评论

引用来自“Nemesis_E”的评论

引用来自“php.by.live”的评论

引用来自“军师”的评论

C++程序员值钱,这就够了。

没JAVA的值钱了,熟练C++的一般也就10K多一点

肯定比JAVA之前 如果没高过10k 那说明还没到精通的地步

精通才高过10k,悲剧啊。。。。

高过10K的意思是比10k高 1000000000K 也是比10k高 你觉得悲剧吗? 那说明你还没精通 精通了就不悲剧了 国内企业不行 就去谷歌苹果 微软等等 他们给的薪水都很高
重要的还是修炼内功 公司都缺人 那些公司也都付得起你能提出的薪水 问题是你能不能胜任这份"薪水"呢

你这个起点也太低了。精通才10k起?java我谈不上精通,obj-c我也谈不上精通,但是我是15k+的。

是的 因为不好估价 这个跟公司给的多少也有关系 有些人精通 但是就是喜欢在一个公司而这个公司又偏偏给的很可怜 哈哈
0

引用来自“抢小孩糖吃”的评论

引用来自“ZeroOne”的评论

引用来自“抢小孩糖吃”的评论

没有内存回收机制,没有内存回收机制T-T

JAVA最大的败笔就是所谓的内存回收机制.
造就了无数的垃圾程序员.
对于真正的优秀程序员来说,
内存管理从来都不是问题.

对于真正的程序员,Java同样需要部分手动内存回收,但是让程序员对内存回收的优化成本,还不如增加内存来的便宜,买多少内存能够解决问题

我只能说你的眼界还只能看到所谓的硬件比软件便宜.
而看不到内存管理的混乱导致的问题. 这个不是增加几条内存就能解决的.
0

引用来自“Nemesis_E”的评论

引用来自“zhj444”的评论

引用来自“Nemesis_E”的评论

引用来自“php.by.live”的评论

引用来自“军师”的评论

C++程序员值钱,这就够了。

没JAVA的值钱了,熟练C++的一般也就10K多一点

肯定比JAVA之前 如果没高过10k 那说明还没到精通的地步

精通才高过10k,悲剧啊。。。。

高过10K的意思是比10k高 1000000000K 也是比10k高 你觉得悲剧吗? 那说明你还没精通 精通了就不悲剧了 国内企业不行 就去谷歌苹果 微软等等 他们给的薪水都很高
重要的还是修炼内功 公司都缺人 那些公司也都付得起你能提出的薪水 问题是你能不能胜任这份"薪水"呢

你这个起点也太低了。精通才10k起?java我谈不上精通,obj-c我也谈不上精通,但是我是15k+的。
0

引用来自“zhj444”的评论

引用来自“Nemesis_E”的评论

引用来自“php.by.live”的评论

引用来自“军师”的评论

C++程序员值钱,这就够了。

没JAVA的值钱了,熟练C++的一般也就10K多一点

肯定比JAVA之前 如果没高过10k 那说明还没到精通的地步

精通才高过10k,悲剧啊。。。。

高过10K的意思是比10k高 1000000000K 也是比10k高 你觉得悲剧吗? 那说明你还没精通 精通了就不悲剧了 国内企业不行 就去谷歌苹果 微软等等 他们给的薪水都很高
重要的还是修炼内功 公司都缺人 那些公司也都付得起你能提出的薪水 问题是你能不能胜任这份"薪水"呢
0

引用来自“Nemesis_E”的评论

引用来自“php.by.live”的评论

引用来自“军师”的评论

C++程序员值钱,这就够了。

没JAVA的值钱了,熟练C++的一般也就10K多一点

肯定比JAVA之前 如果没高过10k 那说明还没到精通的地步

精通才高过10k,悲剧啊。。。。
0

引用来自“hellosijian”的评论

引用来自“php.by.live”的评论

引用来自“mahone”的评论

引用来自“抢小孩糖吃”的评论

没有内存回收机制,没有内存回收机制T-T

加上内存回收机制。。。那不变java了。。。

C++11要是可以 完全 且 方便地模拟 JAVA 那就好了~~~至少可以把Hadoop这些东西拔下来了

哥们你不要倒过来可以吗

哥们这就是事实啊,Hypertable还竞争不过人家一个子项目呢
0

引用来自“php.by.live”的评论

引用来自“mahone”的评论

引用来自“抢小孩糖吃”的评论

没有内存回收机制,没有内存回收机制T-T

加上内存回收机制。。。那不变java了。。。

C++11要是可以 完全 且 方便地模拟 JAVA 那就好了~~~至少可以把Hadoop这些东西拔下来了

哥们你不要倒过来可以吗
0

引用来自“抢小孩糖吃”的评论

提问,为什么我可以用C语言写内核并保证不出内存溢出,然而我无法保证我写的C++的内存溢出在什么地方发生?

你这个保证 从何得来? 你见过哪个C语言写的没有溢出的内核 至少我还没听说过
你完全可以用C++去模拟C语言 甚至写出一样的程序 为什么偏要贬低C++呢
0

引用来自“php.by.live”的评论

引用来自“军师”的评论

C++程序员值钱,这就够了。

没JAVA的值钱了,熟练C++的一般也就10K多一点

肯定比JAVA之前 如果没高过10k 那说明还没到精通的地步
0

引用来自“抢小孩糖吃”的评论

没有内存回收机制,没有内存回收机制T-T

那么喜欢这个功能就自己去写 不会的话 看 <C++ 编程艺术>
0

引用来自“ZeroOne”的评论

引用来自“抢小孩糖吃”的评论

没有内存回收机制,没有内存回收机制T-T

JAVA最大的败笔就是所谓的内存回收机制.
造就了无数的垃圾程序员.
对于真正的优秀程序员来说,
内存管理从来都不是问题.

对于真正的程序员,Java同样需要部分手动内存回收,但是让程序员对内存回收的优化成本,还不如增加内存来的便宜,买多少内存能够解决问题
0
c++不需要gc。
至少在我看来,c++11是很吸引人的。尤其是右值引用。

我在这里喷一下那些觉得c++难学的人,你真的认真学了么?尽管很多人都说难,但至少亲身经历告诉我,认真学是不花多少时间的。。
0

引用来自“抢小孩糖吃”的评论

没有内存回收机制,没有内存回收机制T-T

JAVA最大的败笔就是所谓的内存回收机制.
造就了无数的垃圾程序员.
对于真正的优秀程序员来说,
内存管理从来都不是问题.
0

引用来自“php.by.live”的评论

引用来自“军师”的评论

C++程序员值钱,这就够了。

没JAVA的值钱了,熟练C++的一般也就10K多一点

谁说的C++不如java值钱? 顶级上游公司还是用C++的多.熟练C++才10K? 你知道熟练的java码农(只是码农)是多少钱吗?
0
提问,为什么我可以用C语言写内核并保证不出内存溢出,然而我无法保证我写的C++的内存溢出在什么地方发生?
0
写完最后一个项目用c++ + QT,以后都用大蟒~~~~~
0
有不少是boost里面早就有的东西,只不过挪到c++标准里面了。
0
我很赞同最后一句话,有些词不好翻译,强扭的瓜不甜,意会就可以了!
但是为什么不允许直接转发英文的文章呢?这得省下多少时间!
0
掌握C++太累了
0

引用来自“抢小孩糖吃”的评论

没有内存回收机制,没有内存回收机制T-T

C++有更高的自由度,自动内存回收机制,何时回收,回收哪些都是不确定,也就是说程序员不可控。C++提供更高的自由度的同时,对程序员的素质要求也就比其他面向对象语言更高。毕竟它更适用于系统编程。主要是给系统程序员的。现在用C++开发应用程序的也越来越少了。
顶部