说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

专访图书作者祁宇:C++11让程序更简洁、更现代、更强大

HTML文档下载 WORD文档下载 PDF文档下载
祁宇,资深C++技术专家,致力于C++11的应用、研究和推广。他爱好C++,爱好开源,乐于研究和分享技术,有多个开源项目。日前CSDN采访了他,请他谈谈C++的现状以及未来的发展前景。

祁宇,资深C++技术专家,致力于C++11的应用、研究和推广。金山软件WPS资深工程师,负责Android服务端开发。精通OOP、OOD、设计模式和重构,主要研究方向为架构设计和业务重构,有丰富的开发和研发管理经验。爱好C++,爱好开源,乐于研究和分享技术,有多个开源项目(详见 GitHub),在《程序员》上发表多篇技术文章。2013年被评为珠海市优秀青年人才。

日前CSDN采访了祁宇,请他解读C++11的新标准、C++的现状以及未来的发展前景。 


祁 宇

CSDN:怎么会想到编写《深入应用C++11:代码优化与工程级应用》这本书的?有没有什么故事可以分享下?

祁宇:我作为比较早使用C++11的开发者,在项目中应用C++11的时候,可以查阅的资料还很有限,主要是通过ISO标准(ISO/IEC 14882:2011),维基百科、MSDN和http://en.cppreference.com/w/等网站来学习C++11。然而,这些地方对新特性的介绍比较零散,虽然知道这些新特性的基本用法,但有时候不知道为什么需要这个新特性,在实际项目中该如何应用,或者说最佳实践是什么,这些东西网上可没有,也没有人告诉你,因为当时只有很少的人在尝试用C++11,这些都需要自己不断的去实践、去琢磨,当时多么希望能有一些指导C++11实践的资料啊。在不断实践的过程中,我对C++11的认识加深了,C++11不断地给人带来惊喜,在我窥探到C++11的妙处之后,我很想和更多人的分享,让更多的人更好地掌握C++11的用法和领略C++11的魅力。这是我把应用C++11的一些心得和经验放到我的技术博客上分享出来的初衷,也是我写作此书的初衷。

CSDN:这本书适合哪些读者?书中主要介绍了哪些内容?设计思路是怎样的?

祁宇:适合普通的C++开发者,无论是新手还是老手,都有必要学习和应用C++11,C++11的强大特性可以大幅提高生产力,让我们的项目开发更加得心应手。

本书分为两部分,前半部分侧重从如何去改进我们现有程序的角度去介绍C++11新特性 。这样一来可以让读者学习这些新特性的用法;二来还可以让读者知道这些特性是如何改进现有程序的,从而能更深刻的领悟C+11的新特性;后半部分通过丰富的开发案例来介绍如何使用C++11去开发项目,相信这些实战案例能给读者带来更深入的思考。

CSDN:代码优化的好处有很多,但并不意味着所有的代码都需要进行优化,有时过度的优化反而适得其反,对此,你怎么理解?在实践过程中,你是怎么操作的?

祁宇:确实,代码的过度优化可能会让代码变得更加晦涩,这是应该尽量避免的,另外过早的优化也是不提倡的。事实上,在实际的项目开发过程中,代码优化不是做多了而是做得太少了,很多情况下都是赶进度,赶任务,或者由于自己的水平有限,主观能动性不足,很少会有人花大量时间去考虑代码优化的事,更不会主动通过应用新技术或采用重构等手段去改进代码。

在项目开发中我会采用一些最佳实践来保证写代码不容易犯错,比如我不用裸指针,只用智能指针和guard手法,这样我根本不用担心内存泄漏的问题,通过type_traits在编译期做一些约束确保我们在编译期就能及早地发现问题。项目开发到一定时候我会用一些第三方工具来审查代码,比如Source moniter和Simian,看看我的代码有没有重复代码,有没有深层嵌套,圈复杂度是不是太高等等,然后重构。做这些事情虽然看起来可能会拖慢开发进度,甚至对你的KPI没有任何帮助,但它对你的项目质量却有很大帮助,也许在项目交付后别人忙着改Bug,而你却可以悠闲地喝咖啡了。

CSDN:你怎么看C++新标准?有没有哪些新特性让你印象深刻?它会影响API的设计吗?现存的库如何保持更新呢?

祁宇:C++新标准意味着更强的生产力,让C++更加强大,让你写C++更爽。据说重要的话要说三遍,这句话请重复三遍。

C++新标准有很多特性让人印象深刻,比如,右值引用可以避免无谓的拷贝,提高程序性能;可变模板参数使C++的泛型编程的能力更加强大; type_traits可以使我们方便地在编译期对类型进行计算;智能指针使我们不用担心内存泄露的问题了;线程库让我们能方便地编写可移植的并发程序;auto+decltype不仅让我们写代码更加简洁还让推断模板函数的返回类型更加便利,lambda让算法更清晰等等,不一而足。难怪Bjarne Stroustrup说C++11看起来像一门新的语言了,相信学习和使用过C++11的朋友一定心有戚戚焉。

新标准会让API变得更合理——API的设计会向着更加简洁、清晰、减少语法和语义噪音的方向上演进。当然,更主要的还是取决于使用这些特性的用户。

现存的库升级到新标准的代价是非常小的,希望广大C++开发者及时升级编译器,在新项目中使用新标准,你们失去的仅仅是一个老旧的编译器,而得到的却是巨大的生产力!

CSDN:C++的应用领域变得越来越小,你认为C++的演进方向是什么样的? C++的强势领域在哪里?它未来会有什么样的发展?

祁宇:随着Web和移动的崛起,C++的应用领域相对来说变小了,当一个领域下出现了一门专门的语言能够实现更加简洁的封装,又很容易上手,并且也不再那么需要强调效率的时候,C++被取代是很正常的。事实上,C++是一个通用的语言,它在尽量保证高效的前提下,来实现足够优雅的抽象概念的封装。所以同样的,我们可以看到在前台花样迭出的情况下,后台使用C++来做关键的性能部分是很自然的选择。对于核心的算法,使用C++可以实现一次编码多处编译,从而在任何平台下都有最佳的性能,而上层部分则可根据实际情况及平台选择专门的语言来高效的撰写。另外,在服务器、安全、游戏、嵌入式等领域里,C++依然是不二的选择,随着新标准的出现,现代C++将出现在更多的领域。

虽然C++11相比C++98/03来说已经有了脱胎换骨的变化,但C++仍然在持续发展,充满活力,比如已经出来的C++14和即将到来的C++17,C++17将引入concept、文件库、并行库、网络库和coroutine,这些是非常值得期待的,可以预见的未来,C++的发展会越来越好。随着C++新标准的不断发展,引入越来越多的现代编程语言的特性,C++将越来越受欢迎,C++11的出现已经印证了这一点,在StackOverflow的最近一次调查中,C++11在所有的编程语言中排名第二,这是毫不意外的。

CSDN:Go语言的语法与C++相似,国内外的推崇者也比较多,你认为未来它会取代C/C+吗?

祁宇:二者有一定的相似度,从语法上来说,Go就像一个被重度语法糖包裹的C++,还去掉了编译期/预编译期计算的能力。对于我个人而言,C++的模板和模版元很有趣,也是我喜爱C++的一个重要原因,对于没有模板和模版元的编程语言无疑少了很多乐趣。

我认为未来Go不会取代C/C++,因为它们的应用范围并不相同。Go语言的一些不足也影响了Go的推广,例如,不能忽略import的错误,一些关键实现(如GC)改进迟缓导致生产的软件的缺陷等等。 Go语言相比C/C++可能更擅长并发与分布式(这一点将在即将到来的新标准C++17中得到弥补,实际上C++11已经具备这方面的基础了),而C/C++则更为严谨、朴实和通用,对于C++来说,可以在保证更高效率的同时实现比Go更丰富和简洁的抽象。只要想做,C++完全可以实现Go里的大部分关键字(比如go/defer/switch)。

其实无论什么语言,只要你喜欢并享受它带来的乐趣就够了,与其加入满是口水的语言之争不如为喜欢的语言的发展做一点实际的事情。

CSDN: 除了C++,你还喜欢什么语言?在日常工作中你常用的工具有哪些?

祁宇:我还喜欢C#语言,常用开发工具是VS2013、VIM、Eclipse,intelij;UML设计工具是EA;代码检查的工具是source moniter和simian。

CSDN:你开源了多个项目,这些项目还会经常维护吗?你设计的初衷是什么?你怎么看待开源社区的演进?

祁宇:现在还在维护,而且还在不断增加新的项目,并且有越来越多的人参与进来。

在用C#和Java开发了一些项目之后再回到C++时,不免感慨C++相比C#和Java来说少了很多有用的库,比如AOP、IOC、ORM、steam API等等,所以我希望我能做点事,让C++的世界变得更美好,让C++开发者的日子变得更美好,尤其是这么给力的C++11出来之后,这种愿望就更强烈了,这是我将我工作中开发的一些基础库开源出来的初衷,也是我投入开源社区的动力。

我理解的开源社区是没有功利性的,靠的是一大批编程爱好者对编程的热爱,靠的是一点梦想。除了这些之外,开源社区的发展应该切合现实实际需求,让更多的人愿意参与进来。现在对于C++社区而言是一个黄金时代,因为新标准的不断发展,以前的一些难做之事用现代C++去做都变得很简单,用现代C++去做前人未做之事,弥补以往C++世界的缺憾正当其时。我创建的C++社区(purecpp.org)正是在这个背景下诞生的,社区里不仅有高质量的原创技术文章,还有线下技术沙龙(最近组织了一次主题为C++魔法的技术沙龙,详细信息在这里:http://purecpp.org/?p=202),还有活跃的开源项目,在这里透露一下我们现在正在做的一件有趣的事情,是我们社区的一个开源项目,用现代C++做一个灵感来源于sinatra的现代Web Framework,我们的社区后面升级会采用这个框架,社区网站也将用现代C++开发,敬请关注。

CSDN:给C++爱好者分享些经验和心得感悟。

祁宇:兴趣是最好的老师,享受现代C++带来的乐趣会让你学习C++变得更容易。任何书或资料都只能让你入门,最重要的是实践。在你享受你喜爱的编程语言的时候,心怀感恩,业余之时为这个语言的发展做一点事,生活将会增加更多乐趣。

  • 查看试读样章:《深入应用C++11:代码优化与工程级应用》
  • 向祁宇老师提问,移步社区问答http://bbs.csdn.net/topics/391058121


CSDN现开启图书作者专访栏目,欢迎推荐采访人或自荐,来分享你的成长经历和相关技术,相关信息请发送邮件至:xiamz#csdn.net(#换成@)。更多精彩内容,请点击社区之星或搜索关键字 图书作者查看。
Android Theme主题样式开发注意点 Android 3.0开发用的平板推荐 android.resource://这个Uri你知道吗 ADT插件的10.0.1必须要Eclipse 3.5才能升级 Android线程优先级设置方法 Android Zip文件解压缩代码 Android开发之设置断点单步调试 Android裁剪图片最简单方法 Android平台待开发软件列表 Android开发知识-3月13日总结 Android平板开发注意点 Android 3.0自带的天气预报例子代码 Loader和Fragment使用示例代码 LoaderManager - Android 3.0新特性 帮助ADT改进DDMS中的Logcat中文乱码问题 Fragment API将兼容Android 1.6到3.0 通过Linux Shell实现Android横竖屏切换 Android高手应该精通哪些内容? Android 2.2开始resources.arsc有改变 分析你的Android ANR错误 API Level对照表,更新至2.3.3 ProcessDialog结合Thread处理耗时操作 Fragment示例代码 DialogFragment示例代码 ActionBar示例代码 (二) Action Bar示例代码 (一) ActionBar使用方法 - Android活动栏(二) Action Bar使用方法 - Android活动栏(一) DialogFragment类介绍 Android Fragment使用详解 Fragment对比Activity - Android碎片介绍 vc++7.0好用吗? 吃完晚饭了... 可不可以让 CppWebBrowser1的背景不是白色? 热热热!!!热疯了!!! 我的喇叭哪儿去了? 我的PB程序出了问题了!!! sql server中哪个函数是用于字符串与整型之间转换的? 我想限定文本输入框只能输入10个汉字或20个英文字符,但文件输入框却只能输入10个英文字符,如何解决? 当我将这样的字符串“dsdsdsdfsdffsdsdfsdfsfdsdfsdfsfsfdsdffs.....”放入我的表格中时,无论怎样设置也不折行,影响了部局,如何解决? MFC中视图(view)是怎样随着主窗口的大小改变而改变的。 急!请教!!猫猫连接,用数据管道同时访问两库,访问不到对方的网络库(sybase) 关于电影下载 我已经把一个exe文件加入到我自己的程序中了,请问在我的程序中应该样调用该exe文件呢? 哪位高手知道RTF格式的含义?或者更好,知道Rxlib中的RXRICHEDIT控件中识别RTF格式的方法? Delphi编写的DLL在VC下不能使用 请问哪儿有电工的<>的电子版下载?我只有这么多了 msdn2001年4月版的讨论 请问哪儿有电工的<>的电子版下载? 请教高手!!!! 请进 各位:周末愉快!为何我的多表查询用updatebatch提交时总是报错? 我不明白!!!! 请问,BAS 与 VBJ 有什么区别吗?为何他们安装在同一个目录呢? 如何得到系统进程的列表? vi下如何撤销操作? 我们知道MFC中的对象序列化做得很好,不知在DELPHI中怎样来实现对象的序列化? 我已经学过C++,想学VC++请问哪本书入门比较好啊? 欢迎使用技巧酷skillstore beta 1.00 有个可以显示IP的QQ,很不可思议,讨论一下好吗? 怎样在程序运行的时候加上参数,比如说双击文本文件打开记事本 谁有运行后烧硬件的程序 用VC开发如何实现网页的同步浏览呢? 动态产生的datawindow怎样调整它的显示? 怎么从ORACLE白痴到高手 怎样通过程序员考试??????? 庆祝北京成功 COM基础问题 感谢huangguanshu回答我的问题,请进来拿这200分 老问题了,access to SQLserver 关于的js问题(高分相送) 谁有运行后烧硬件的程序,要多少分都给. 请高手赐教, DDDW 的问题 ?谁有运行后烧硬件的程序,要多少分都给. hotmail box怎么用不了? sql的image型字段内容如何输入? 谁有运行后烧硬件的程序,要多少分都给 谁有运行后烧硬件的程序??要多少分都给 谁有运行后烧硬件的程序???要多少分都给 Linux是不是不支持POSIX IPC啊? 关于red hat 7.0与WIN98 共存的问题 关于用PostMessage发消息时所遇到的问题 试用适当方法表示由二元二次方程组y=x+2,y=x²的解组成的集合 求教求教QAQ 方程x²-9=0的解集是? 如果a²-4b²=20,且a+2b=-5,则a-2b的值是() A.5 B.4 C.-4 D.-5求结果 思路 速求~ 已知a=1/3,b=0.2,求代数式a³-b³/a²+ab+b²的值 1:已知m=x-y,n=xy,试用m,n表示(x³+y³﹚²,2:当x=-1时,x³+2x²﹣5x-6=0,请根据这一事实,将x³+2x²-5x+6分解因式.没分了,不好意思, 方程x²+x+1=0所有实数解的集合,用描述法表示. 已知实数a、b满足ab=1 a+b=2 求代数式a²+b²的值. 设Y=X²-ax+b,A={x|x-y=o},B={X|y-ax=0},若A={1,-3},求集合B(用列举法表示) 用公式法解下列方程(1)x²-6x+1=0(2)2t2-t=6 (3)4x2-3x-1=x-2 (4)3x(x-3)=2(x-1)(x 1) 已知(a+b)²=7,(a-b)²=3.求a²+b²、ab的值 设集合A={x|x²-2x-3=0},B={x|x²-ax-a²+1=0}(1)若a=-1,求A∪B(2)若A∩B={3},求实数a的值 方程x²+x+1+2根号(x²+x+4)=0用换元法解题,设y=___________,则所得方程为_______ 已知:(a+b)²=7,(a-b)²=3.求a²+b²和ab的值 若集合A={-1,3}集合B={x|x²+ax+b=0}且A=B求实数a,b 用列举法表示集合 B={y∈N}|y=—x平方+6,x∈N} C={(x,y)|y=—x平方+6,x∈N,Y∈N} 已知(a+b)²=7,(a-b)²=3,则a²+b²与ab的值分别是 已知实数ab 分别满足a²+2a=2 b²+2b=2 求a分之1 + b分之1 的值 已知(a+b)²=7,(a-b)²=3,求(1)x²+y² (2)xy的值 设A={(x,y)|y=x²+2x+5},B={(x,y)|y=ax+1},问:(1)a为何值集合A∩B有两个元素?(2)a为何值时,集合A∩B至少有一个元素? 已知实数a,b满足a(a+1)-(a^+2b)=1,求a^-4ab+4b^-2a+4b的值 已知a+1/a=7,求a²+1/a²的值 用列举法表示集合A={y/y=X²,-1≤x≤1,x属于N},-1≤x我知道-1≤x≤1 中x=-1,0,1 因为x属于N,所以x=0,1 x的值用集合可表示为{0,1}.当x=0时 y=0 ,当x=1时 y=1 所以A={0,1}.亲 这是为什么呢 已知实数a,b满足a²+2a=2,b²+2b=2,且a≠b,求b/a+a/b的值 用配方法证明:代数式-x²+6x-8的值一定不小于1. 集合P={(x,y)| y=x²+2,|x|≤1,x∈Z},用列举法表示集合P 已知实数a、b满足a²+2a-1=0,b^4-2b²-1=0,且ab²1,(在下面补充题目)求[﹙ab²+b²+1﹚/a]²º¹º的值上面打错了,是“且ab²≠1”,不是“且ab²1” 用配方法证明:代数式-x² 6x-8的值一定不大于1 集合﹛﹙x,y﹚│y=-x²+6,x∈N,y∈N﹜怎样用列举法表示?问题在于它没给符号,那我怎么表示? 已知2b-b=7,求代数式[a²+b²-(a-b)²+2b(a-b)]÷4b的值 用配方法说明代数式X²-6x+10的值大于0 '用列举法表示下列集合 (1)A={x∈N∈0 已知a²+b²+2a+4b+5=0.求代数式[(a+b/2)+(a-b/2)²]·(2a²-1/2b²)的值. 用配方法说明:代数式x的平方-6x+13的值恒大于0 用列举法表示下列集合 ①A={x|x²=9} ②B={x∈N|1≤x≤2} ③C={x|x²-3x+2=0} 若实数a,b满足a+b²=1 ,则a²+4b² 的最小值是..? 用配方法证明代数式5X的平方-6X+11的值,恒大于0 2x²-3x=2 2x²-4根号下2x+3=0 3x²+2x=0 用配方法解方程 已知a,b为实数,则a²+ab+b²-a-2b的最小值 用配方法说明代数式中x平方-12x+40的值恒大于零 解方程:2x²+2/x²-7x+2=0 已知实数a,b满足a(a+1)-(a²+2b)=1,求a²-4ab+4b²-2a+4b的值 用配方法说明:无论x取何值,代数式2x-x的平方-3的值恒小于0. 写出由方程x²-(a+1)x+a=0的解组成的集合中的元素答案清楚,就是不知道怎样描述这个集合,希望过程能写详细点 设a.b为实数,求a²+2ab-2b²-4b+5的最小值,并求此时a与b的值.急用阿 用配方法说明代数式X平方--5X+7的值恒大于0 以方程x²-4x+4=0和方程x²-x-2=0的解为元素的集合中含有___个元素. 已知a-2b=7,ab=-3求a²+4ab+b²急需. 代数式x^2+2mx+2m^2+1的值恒大于零 以方程x²-4x+4=0和方程x²-x-2=0的解为元素的集合中含有几个元素 A-2B=7 AB=3 求 A²+4AB+B² 设a=1/2m+1,b=1/2m+2,c=1/2m+3,求代数式a²+2ab+b²-2ac-2bc+c²的值.要过程! 用列举法写出方程 x²-(a+1)x+a=0 的解集 已知(a+2b)²=7,(a-2b)²=3,求:⑴a²+b²的值,⑵ab的值 若代数式mx²+2(3-2m)x+1(m≠0)是关于x的完全平方式,求m值 用列举法表示下列方程x²-2x+1=0的解集 计算:[﹙ab-2b﹚²×﹙2a﹚²-﹙4ab﹚²]÷[16a×﹙ab﹚²]还有一题,把下列个多项式分解因式(m²+3)²-8(m²+3)+16还有一题,当y-x=5时,求x²-y²+5x+5y+2009的值 试用适当的方法表示由二元二次方程组{y=X+2} 组成的集合 { y=X²}试用适当的方法表示由二元二次方程组{y=X+2} 组成的集合{ y=X²} 用公式法解关于x的方程ab(x²+1)=a²x+b²x(a²>b²) 已知a-2b=½,ab=2.求a³b-4a²b²+4ab³的值.
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn