副标题#e#
此刻,有许多C/C++措施员老是自命特殊,看不起其他开拓人员。其实,或者别人更看不起他呢!
>> 有成见的永远只是个别,而不是群体。作者加了后头那句,无疑证明有成见的不是C/C++措施员,而正是他本身。
学生时代,我也曾醉心于C/C++,但时至今天,始终无法写出无懈可击的C++代码,所以我始终认为我不会C/C++。这些年,我一直在寻找编写C++代码的最佳模式。可是,诚恳说,我还没有见到过哪个称得上好手的C++措施员,也没有见到过写得Very good的C/C++代码。C/C++代码老是丑恶不堪,BUG丛生!
>> 这段话越发谬妄了。没见过优秀的C/C++代码? C++尺度库(STL)如此优雅。何况,有那么多经典的C/C++开源作品,以及无意之中泄漏的Windows NT焦点源码,哪一样不是绝世之作?我为作者浅陋感想惆怅。
我用C语言编程已经高出20年了。我写过C语言的编译器、C语言的调试器、用C开拓的其他语言、游戏、客户端措施和处事器措施,你说吧!尚有什么是我没写过的。尚有我的书架上充斥着折了角的K&R和Steele的书。我太相识C语言了,可是,我讨厌他。十分讨厌!
当我读到一篇博客,题目是"为什么每个措施员都应该进修C语言?"时,我真是鸡皮疙瘩满地。假如你真的是个专业的措施员的话,你必定以为这是个天大的笑话,尽量作者的本意也许不是这样的。这篇辩驳的文章有点意思,可是照旧没有抓住本质。所以我展开了说一下。有以下5个原因来说明,为什么那些会C语言,而且利用C语言的措施员,此刻不单应该去用此外语言,并且应该健忘他们进修C语言进程中的那些烦人的对象。
1、内存分派
仅仅关于这一点我就能写整整一篇文章了,也许能写一本书,甚至尚有大概写出可以或许塞满图书馆技能书籍那块,那么多的内容。内存分派和存储单位分派的存在确确实实是个大贫苦。你要不就是分派太少的内存不足用,要不就是分派了太多内存挥霍掉。这里的问题就是:怎么把它初始化为零呢?照旧爽性就不初始化它。但最挠头的步调照旧释放内存。所有已有的东西包城市辅佐你确认,你是否已经释放了之前分派的每一位的内存,在释放完之后是否永远不利用它,而且会阻止你,永远不要释放它第两次。更严重的是,分派内存和释放内存在C语言中都是很慢的,很是慢。利用内存分派时,要思量的各类非凡环境,我真是连想都不肯意去想,只要问题(工具)的巨细符合,我更愿意利用栈空间可能事先分派的布局空间。假如这么做的话,我就有更值得烦恼的事了。话说返来,发现垃圾处理惩罚器那人真应该得诺贝尔奖。
>> 内存打点是措施设计中最经典的话题。GC无疑是内存打点一个伟大的厘革,可是我只是把它看作内存打点的一个办理方案,而认为不是独一的办理方案。比GC越发优雅的方案不见得没有。我较量倾向于在特定的环境下选择符合的内存打点方案,而不是没有任何选择的余地,而这正是C/C++的伟大之处。 所有那些GC语言(如Java、C#等)均把这个办理方案强加给措施员,这必然水平上来说减轻了措施员的承担,可是也同时约束了措施员的主观能动性。"分派内存和释放内存在C语言中都是很慢的"?不知道作者从那边得到的结论。
2、多线程
我已往是喜欢C语言的,真的。直到我开始用C开拓并维护多线程的处事器。在为毗连相斗嘴的线程掩护数据方面,C语言没有为措施员提供那怕一点点的辅佐。你在利用单线程的日子里得到的每一个直觉、履历,用在多线程的时候都是错误的。至少JAVA有暗示同步的要害字和备有证明文件(可是是个很奇怪的文件)的影象体,但纵然是这样,除非你利用新的javax.concurrent,不然也只能在那些庞大的平行摆放的呆板们眼前瓦解。回到C语言上:在模仿出产的情况下,僵持一个礼拜在数据中心调试一个死锁(这事真的产生过)。而JAVA却只需要Ctrl+Break!天哪!!!
>> C/C++语言自己确实没有太多MultiThead的支持,这种环境在C++0x出来后可望改变。可是,请记着C/C++永远倾向于你利用成熟的库来办理问题。
3、指针
指针太难以节制了,太阴险了;我甚至没有委婉一点的方法去形容它。我生掷中每年都有几个月被用来调试那些奇怪的指针问题。我已往经常尽力获取所有的诀窍,例如说难以领略的组成符、连系体和偏移量,以及重用最后两位做标志,尚有所有其他的诀窍。但我发明这么做基础不值得。其他语言的静态引用就可以办理了。
>> 指针是C/C++过于机动的浮现。利用指针的代码可以写得很丑恶,但一样可以很优雅。——这一点上用何种语言不会有区别。我相信,可以写出优雅的Java代码,那么也必然可以写出同样优雅的C/C++代码。而反之则未必(因为有些C++某些范式是Java所不能支持的)。C/C++语言中的选择太多,这简直是令人狐疑的,但不见得是劣势。我对C/C++措施员的发起是,多相识和利用C++尺度库,而不是过于胶葛指针相关的细节。
#p#副标题#e#
4、过早的优化
#p#分页标题#e#
说到诀窍,你是否曾经挥霍脑细胞去研究毕竟*p++是不是比p[i]快?你是否曾经花时间去试着做点变革来取代乘法,可能去实验使轮回中的倒置运行更快的要领?还在为通报一个参数的速度和阻挡添加布局,而且通报它的速度一样而苦恼不已?停吧!算法是速度的要害,措施员的程度抉择了他会利用那些算法。知道这一点能让你的措施更好,更快一点而且让你的脑壳少扭几个筋。好吧,有一些例子也许可以这样做的……不,你就别那么做就行了!
>> 算法优化是措施设计的要害。可是凡是环境下,所有语言(包罗C/C++)的措施员研究的是要害路径的优化。研究*p++是不是比p[i]快?我相信这是尺度库的实现者要思量的工作。所差异的是,C/C++措施员也可以和尺度库的作者一样去思量这些细节,而其他语言的措施员被剥夺了这个权利。
说到优化,话题就多了。我曾经向C#的Dictionary中插入了1亿条整数(从1万多个文本文件中读入),功效发明措施运行了整整一个下午仍然没有完成。而我改用C++的std::map,20分钟就搞定了。再试试对50万条自界说的布局体数据举办排序,我相信你和我一样,会深深喜欢上C++的的高效而优雅。
5、测试
你最喜欢的C的单位测试的东西是哪个?嗯…一个也想不到?单位测试必然是一点也不重要,是吧?可能是太贫苦了,很难跟长进度,挥霍时间。你可以把这个时间用到越发有用的工作上,让它只占用事情时间的1%,那还较量符合。可能在数据中心,通过优化的没有标志的图形来调试这个仅仅由100个同时在线利用者引起的问题。
>> C++的测试东西,作者居然一个都想不到,我只能意料大概他是较量喜欢本身制造轮子的那一类。和JUnit对应的CppUnit,莫非也想不到?提起CppUnit,我以前用它举办单位测试,但从实现架构上说,我认为它担任了Java代码的臃肿。我在WINX中提供了一个Mini版本的CppUnit,代码量或许只有几百行,成果毫不比CppUnit弱。(要相识WINX,请看这里)。
我原来应该继承再说一些原因的,可是5个此刻就足够了;说完这些,此刻感受好点了。C以前长短常棒的…那是在1984年的时候。直到本日,那些用C写的新代码都让我感想惊喜…假如你让我较量的话,我以为C++只是比C稍微好点。假如你想要学些老一点的语言,不妨实验Forth,List,可能APL。这些老式的语言起码能教会你,用差异的并且优雅的方法去思考你的措施。
>> 新生的语言,一定会在接收旧的语言上基本长举办改造。看一个语言的生命力,并不在于看它某些处所存在的不敷。事物会成长,并趋于完善。相信C++0x出来后,C/C++语言又将得到新的生命力。单看Java、C#等几个新一代的语言,个中有如此多的C++烙印,就证明白C/C++的影响是庞大的。动不动说一门语言死了,是一种浅薄。