我阅读的文章
http://developer.51cto.com/art/201106/270597.htm 掀起C++11的神秘面纱
http://www.ibm.com/developerworks/cn/aix/library/1307_lisl_c11/ C++11 标准新特性: 右值引用与转移语义(讲解清楚易懂)
http://gcc.gnu.org/projects/cxx0x.html C++0x/C++11 Support in GCC
http://mindhacks.cn/2012/08/27/modern-cpp-practices/ C++11(及现代C++风格)和快速迭代式开发(现实案例)
http://blog.csdn.net/gzlaiyonghao/article/details/6564162 C++11中值得关注的几大变化
http://zh.wikipedia.org/wiki/C%2B%2B11 Wiki C++11 (介绍非常全面,但仍有遗漏)
http://www.cnblogs.com/weidagang2046/archive/2009/08/19/1549473.html GC vs RAII
http://msdn.microsoft.com/zh-cn/library/vstudio/hh438473.aspx 对象生存期和资源管理(现代 C++)
http://msdn.microsoft.com/en-us/library/hh279654.aspx Welcome Back to C++ (Modern C++)
http://msdn.microsoft.com/en-us/library/hh438469.aspx String and I/O Formatting (Modern C++)
http://msdn.microsoft.com/en-us/library/hh438471.aspx Algorithms (Modern C++)
http://msdn.microsoft.com/en-us/library/hh438470.aspx Containers (Modern C++)
http://msdn.microsoft.com/en-us/library/hh438477.aspx Pimpl For Compile-Time Encapsulation (Modern C++)
http://msdn.microsoft.com/en-us/library/hh279674.aspx Smart Pointers (Modern C++)
http://msdn.microsoft.com/en-us/library/hh438480.aspx Objects Own Resources (RAII)
http://msdn.microsoft.com/en-us/library/hh438473.aspx Object Lifetime And Resource Management (Modern C++)
http://msdn.microsoft.com/en-us/library/dn387583.aspx Uniform Initialization and Delegating Constructors
我的感想
在去年做C++大作业时,当时我需要实现一个线程模型,采用了C++11的特性,在作业中我使用了C++11线程模型中的互斥锁以及thread_local等特性,感觉C++11的线程模型简单优秀,实现同样的功能我只用了使用C的一半代码就足够了,而且还有thread_local这样强大的特性可以使用,它提供的类似进程级别的隔离让程序非常灵活,不过同时C++11的线程也显得非常单薄,当时代码恰好可以使用一个C++14的特性就能更完美的解决,而C++11提供的功能却必须花费相当多的代码来搞定,可能确实是因为线程的模型太难在各个平台下有好的统一的实现。
lambda表达式是一个我非常喜欢的特性,在C#的编程过程中,lambda表达式我经常使用,他可以使用闭包中的变量,轻易的传递,使程序能更好的模块化,弹性更强,在C++里对lambda表达式加入一些特有的限——对于闭包访问的限制,C++11在使用lambda需要使用[]方括号来规定对闭包引用的限制,在C#中则使用了默认引用的方式,我原先认为这是一项鸡肋的功能,lambda表达式通常作为短函数出现的在函数体内部,因而对于对于lambda表达式内的资源管理不会花费太大精力,因而不必加入这样的限制,但是[]在带来更多灵活性的同时,我想可能也会带来更多代码管理上的成本,用户在使用lambda表达式还必须了解其对外部访问的限制,每个lambda表达式不尽相同,这带来的代价或许不容易承受。
C++11不尽在语言功能上有巨大改进,在标准库的改进上也值得一提,新的C++终于加入了散列表容器,Hash容器在其他语言中很早就会成为必备的组件,但在C++里一直不被很好的支持,在一般情况下,Hash容器的性能是优于平衡树的,Hash容器更加适用于要求快速查询,且冲突较少的情况。在字符串处理相关的库中,加入了正则表达式,这项功能无疑大大增强了C++处理字符串的威力,正则表达式一直以来都是处理字符串的利器,而这方面给的功能在C++中都是第三方库提供的,有了正则表达式和新的对utf更好的支持,在对性能要求严格的情况下,我们能用C++代替很多脚本语言更轻松地写出所需功能,而减少纠结结于性能与开发效率的权衡。新的随机数生成组件也是C++11一个重磅功能,至少在我看来,使用C++生成大随机数长久以来都是非常困扰我的问题,每次都必须实现差不多的代码,而且效果不能保证,新的库功能异常强大,支持生成各种类型及分布的随机数,非常易用,相信这个改进会在相当长的时间内满足很多人的需求。虽然添加很多新功能,但仍有写工具是我们希望添加但没有实现的,例如Socket,Socket实现或许涉及过多底层调用,难以做到各个平台统一,因而未在C++11中出现,希望能在以后的改进中逐步加入。
C++长久以来一直是运行效率的代名词,但在开发效率上则为人所诟病,在C++11中所做的改进确实非常优秀,改进并未牺牲执行速度而换取更好的开发控制,相反在做出多个效率上的提升的同时也大幅度改进了C++开发方式,RAII我目前理解上是一种不同于GC的避免程序员出错的机制,遵循RAII能够实现更安全的代码,同时避免了GC的低效率。虽然业内有看法认为,硬件运行速度一直在快速提升,因而程序本省的执行速度会随着硬件的提升越来越快,只要你的代码是可移植的,但同时我们必须承认实际问题需求的执行效率也是在快速增长的,10年前或许互联网还是极客的玩具,而现在12306就要面对5亿网民的狂轰滥炸,程序的运行效率在相当长的一段时间内仍会是一个必须非常重视的因素,C++11正是顺应的这种潮流而产生的利器,相信在往后更长的时间内,这门老旧的语言亦然会展示出非凡的声明活力。
我的问题
在C++11中,我们可以用轻易的用int&&来代替int&和const int&,int&&可以返回const和non-const属性,但是能否将任意的引用参数替换为右值引用?,也就说是否存在必须的情况必须使用const& ?
C++11中新出现的move操作可以使用相当小的代价将一个对象的数据传递到另一个数据中,这是在C++03里没有的特性,因而程序员在使用旧式C++时会尽量避免不必要的对象复制操作,那么在引入move操作后会给原有的STL带来多大的性能上的提升呢?
在阅读博客的过程中,我初步了解RAII的概念,在C++11中增加了shared_ptr这一智能指针同样支持了这个概念,当shared_ptr的引用计数归零时指针将被注销,在英文版的材料中使用了owner of pointer的叙述,那么这个指针实际上是如何在工作,引用计数的实际含义是什么,RAII的概念在其中又如何体现,并且发挥着怎样的作用?
在一篇旧的报道里提到C++可能在未来会提供GC功能,但未必会提供标准的线程支持,但事实上C++11优先提供了线程支持而非GC,在最新的GCC8.2中已经提供对了C++11全面的支持唯独没有GC,而VS却优先提供了GC而并未支持大量的其他功能,那么GC对C++到底有什么样的意义呢,C++应该是由用户管理内存还是由编译器管理内存?
在假期参加了一次Google的夏令营,当时课上的老师谈到,在Google的代码设计中禁止在C++中使用异常,错误全部由控制代码处理,但是在C++11中异常作为重要的错误处理机制出现,事实上该项特性对软件工程也非常重要,然而实际上C++11的异常设计是否健壮合理,能满足工业需要,它的设计是否有独特的地方呢?
Google的老师还提到了C++的IO处理非常冗杂, 在Google内部同样禁止使用stream作为IO,只有在log系统内或无法选择其他工具时才能使用,在我个人使用stream时也深深感受到其不仅繁复而且效率低下,C++11的出现带来了语言上的大量变化,那么在stream的使用上是否也有新的变化?
C++11放宽了对POD的标准,我对POD的作用并不了解,这项改进将会带来怎样的作用呢?
前面提到RAII概念将对象与资源区分,资源由对象来管理,而在C#中资源与对象的概念似乎是同一的,例如在C#中如果我忘记对StreamWriter进行close,数据并不会写入IO,但在C++里却会自动flush,那么这两种设计理念在对待非内存资源的操作时根本上有何不同?
我不太了解C++模板的实例化方式,C++11引入了外部模板的具体运行方式与原先有何不同?
C++里引入了多项实用而且强大的语法,比如auto关键字,...运算符,例如auto关键字可以自动识别对象类型,能够大幅缩短一些语句的长度,却不损失可读性,让代码更加灵活,但是在引入这些强大特性后,是否会引发新的问题呢,例如程序员有可能滥用auot或者右值引用,这是否会在可预见的领域内造成不必要的损失?