derulin123 发表于 2018-9-15 22:59:47

C++的反思


                                                                                                    来自:Skywind Inside
作者:skywind
链接:http://www.skywind.me/blog/archives/1398


近来两年 C++又有许多人出来追捧,而且追捧者布满了各种良好感,好像不写 C++你就一辈子是低端步伐员了,面临这种征象,要不要出来适时的黑一下 C++呢?呵呵呵。


咱们要有点娱乐精力,关于 C++的笑话数都数不清:


笑话:C++是一门不祥瑞的语言,听说波音公司之前用ADA为飞机硬件编程,不停用的好好的,厥后雇用了一伙大门生,门生们说我靠还在用这么落伍的语言,然后换成C++重构后飞机就坠毁了。


笑话:什么是C++步伐员呢?就是原来10行写得完的步伐,他非要用30行来完成,并自称“封装”,但通常到第二个项目标时间却将80%冲破重写,并美其名曰 “重构”。


笑话:C轻易擦枪走火打到本身的脚,用C++固然不轻易,但一旦走火,就会把你整条腿给炸飞了。


笑话:同时学习两年 Java的步伐员在一起讨论的是面向对象和计划模式,而同时学习两年 C++的步伐员,在一起讨论的是 template和各种语言规范到底怎么回事变。


笑话:教别人学 C++的人都挣大钱了,而许多真正用 C++的人,都死的很惨。


笑话:C++有太多地方可以让一个人体现本身“很智慧”,以是利用C++越久的人,约以为本身“很智慧”效果步入陷阱都不知道,掉坑里了还以为估计是本身没学好 C++。


笑话:很多多少写了十多年 C++步伐的人,至今说不清晰 C++到底有多少规范,至今仍旧时不时的落入某些坑中。


笑话:许多以为 C++方便跨平台的人,现实编写跨平台代码时,都会发现本身难找到两个支持雷同尺度的 C++编译器。


—————


Q:那 C++为什么还能看到那么多粉丝呢?


A:实在是由于 Windows,由于 Windows的鼓起动员了 C++,C++原来就是一门只得当开辟 GUI的语言。


Q:为何 C++只得当开辟 GUI呢?


A:你看 Unix下没有 GUI,为啥清一色的 C呀?全部的体系级题目都能在 C里找到成熟的办理方案,应用级题目都能用其他高级语言很好地办理,那里有 C++什么事变呀?


Q:你蛮横无理,Unix下也有 C++的项目呀。


A:有,没错,你任然可以用任何语言编写任何糟糕的代码。


Q:别瞎扯了,你都在说些什么?连C++和 Windows 都扯到一起去了。


A:追念下当年的景象,一个大牛在教一群初学者怎样编程。一边开辟一边指着屏幕上说,你看,这是一个 Button,我们可以用一个对象来形貌它,那是一个 panel我们也可以用一个对象来形貌它,而且你们有没有发现,实在 Button和 Panel是有血缘关系的,你们看。。。如许就出来了。。。。下面的门生从前都是学着学校落伍的课本,有些乃至还在用 turboc的 bgi库来画一些点和圆。那里见过这么这么富丽的 Windows 界面呀。大牛说的话,象金科玉律一样的铭刻在本身幼小的生理。一边学着 Windows,一边发现,果然,他们都必要一个基类,果然,他们是兄弟关系,共同包罗一些根本属性,可以放到基类去。他们越用越爽,潜意识里以为由于 C++这么顺遂的帮他们办理那么多界面题目,那看来 C++可以帮他们办理统统题目了。于是开辟完界面以后,他们继承开辟,当他们遇到各种计划题目时,反而以为肯定本身没有效好 C++。于是逼迫本身用下去,然后就完蛋了。


(点击 more睁开)


—————


关于 C++的笑话我有一箩筐,各位 C++粉用不着对号入座。言归正传,为什么要黑 C++呢?谈不上黑不黑,我从94年开始利用 C++(先前是 C 和 Pascal),一起看着 C++发展强大,用 C++写过的代码,加起来应该凌驾 10MB了吧,C++的各种宝典我也都读过,不停到 2004年开始切回 C,重要缘故原由是发现许多没法用 C++思绪继承办理下去的题目,大概说用 C++思绪办理下去会很糟糕的题目。


当时候(2004-2005)正是 C++满天飞的时间,言必称 C++,用必用模版,我跳出来说你们醒醒吧,别偏激了,这个天下并不是都是抽象数据布局和算法就可以形貌清晰的。于是许多人冲动的跳出来说:“你没了解到 C++精华,你根本都不会用 C++”。我问他们:“语言是用来办理题目的,假如一个语言学了三四年都会常常掉沟里,算好语言么?假如编写十多年 C++的步伐员都很难把握得了,这算好语言么”。他们又说:“语言是死的,人是活的”。


我记得其时一位国内 C++大牛,为了改正我的 “错误观点”,给我看过他写的一套非常强盛的库,我打开一看,倒吸了一口寒气,全部是 .h文件。我只能回他三个字:“你牛逼”。固然这是一个极度的例子,那家伙厥后终于也开始把 .h内里的东西渐渐挪到 .cpp内里了,这是功德。


其时和云风在一家公司,2004年新人培训时,他给新人部署了一个实现内存分配器的作业,修正作业的时间,他常常边看边问人家,“不敷C++呀,你能不能百分之百OOP?”,“1%的 C都不要留”。我其时在公司内部邮件列表内里发过关于 C++的题目,大部门人都表现:“你看没有C++我们怎么写3D引擎呢?”。我跟他们讲:“John Carmack直到 Quake3都还在用着 ANSI C,厥后由于不得不支持 D3D,改用 C++了。为啥 C不能写 3D引擎了?”。他们告诉我:“你看,Point,就是个对象,Matrix也是个对象,那么多 Vector的代数盘算,用 C++的算术重载是多么美好的事变,三维天下就是对象的天下。”。


确实其时客户端 GUI的话,只有 C++,图形引擎也只有 C++,这两个正是C++最强的地方,以是我也没和他们争辩,逼迫他们认可 C也可以很美丽的写图形,而且C写的可以写的很优雅。我又不是闲着没事变,何须去质疑人家的焦点代价观呢,呵呵。当年我正在接办一个 C++项目,代码凌驾 800KB,每次瓦解都必要耗费很长时间去定位,项目中大量的前后依靠,改一个地方,前后要看好几处,一处遗漏,整个体系就傻逼了。我开始重构后,画了两个星期,将性能敏感的焦点部门剥离出来用 C实现(代码量仅 200KB),然后导出 Python接口,用Python来完成剩下的部门,整个脚本层代码量只有 150KB。整个天下清新了,整个 C++项目原来的工期为 2个步伐员四个月,我一个人重构的时间加起来就 1.5个月,而且代码量比远来少了两倍还多,各种奇异的 BUG也一扫而尽。我看看左边的 800KB一团乱麻的 C++代码,再看看右边整齐的 300多 KB 纯 C + Python,琢磨着,这个项目干嘛不一开始就这么做?


跨语言接口


当代项目开辟,不光必要更高的性能,而且必要更强盛的语言形貌本领。而 C++正处在一个尴尬的地方,比底层,它不如 C可以或许准确的控制内存和硬件,各种隐式构造让你防不胜防;比形貌本领,比快速业务开辟和错误定位,它又赶不上 Python, Ruby, Lua等动态语言,处于东线和西线同时遭受挤压和蚕食的田地。


很快,2006-2007年左右,其他项目组各种滥用 C++的题目开始显现出来:其时脚本化已经在工程实践中得到极大的乐成,然而某些项目一方面又要寻求 100%的 C++,另一方面又必要对脚本导出接口,他们发现题目了,不知道该怎么把大量的 C++底子库和接口导给 Lua。


C的接口有各种方便的方式导给脚本,然而整个项目由一群从来就不消于利用脚本的cpp大牛开辟出来,当他们要吧cpp类导出接口给脚本时,他们计划了一套牛逼的体系,lua主动天生呆板码,去调用c++的各种类,没错,就是c++版本的cffi大概ctypes。他为调用vc的类写了一套呆板码生产,又为调用gcc的类写了一套代码天生。那位cpp大牛写完后到处夸耀他的结果,厥后他去职了,项目上线一而再再而三的出现无可查证的题目,厥后云风去增援谁人项目组,这套盘根错节的c++项目,这套盘大的代码自天生体系深深的把他给恶心到了。厥后众所周知云风开始反C++,提倡回归C了,不知道是否和这个项目有关系。


于是发现个风趣的征象,但凡善于利用脚原来进步工程服从的人,根本都是C加动态语言办理大部门题目(除了gui和图形),但凡以为c++统治宇宙的人许多都是从来没利用过脚本大概用了还不知道该怎样去用的人。


依附如许的方法,我们的产物同竞争对手比拼时,同样一个功能,同样的人力设置,竞争对手用纯C++要开辟三月,我们一个月就弄出来了,同样的时间,对手只能试错一次,我们可以试错三次。厥后,据我们雇用过来的同事说,竞争对手也开始渐渐低落 C++的比例,增长 java的比例了,这是功德,各人都在进步嘛。


ABI的尴尬


ABI级别的 C++接口从来没有尺度化过,以类为接口会引入许多隐蔽题目,好比内存题目,一个类在一个库内里实例化的,假如再别的一个库内里开释它们就有许多题目,由于两个动态库大概内存管理体系是不一样的。你用这里的 allocator分配一块内存,又用那边的 allocator去开释,不出题目才怪。许多办理方法是加一个 Release 方法(好比 DX),告诉表面的人,用完的时间不要去 delete,而是要调用 Release。


项目写大了各个模块隔离成动态库是很正常的,而各种第三方库和本身写的库为寻求高性能引入特定的内存管理机制也是很正常的。许多人不留意该调用release的地方错写成delete就掉沟里去了。更有胜者跨 ABI界说了许多inline方法的类,效果各种隐式构造和析构实在在这个库里天生,谁人库里被析构,乱成一团乱麻。C就清楚许多,构造你就调用fopen,析构你就fclose,没有任何歧义。实在C++的抵牾在于一方面认可作为体系级语言内存管理应该交给用户决定,一方面本身却又界说许多不受用户控制的内存操纵举动。以是跨 ABI层的c++尺度迟迟无法被界说出来,不是由于多态 abi复杂,而是由于语言逻辑出现了相互抵牾。为了补充这个抵牾,C++引入了operator new,delete,这new/delete重载是一个补丁并没从逻辑上让语言变得完备,它的出现,进一步将利用者拖入bug的深渊。


实在本日我们回过头去看这个题目,能发现两个根本原则:跨abi的级别上引入不可控的内存机制从语言上是有题目的,只能要靠开辟者约定各种机灵的基类和约定开辟规范来办理,这个题目在语言层是办理不了的;其次你既然界说了各种隐式构造和析构,就该像java在世动态语言一样彻底接受内存,不答应用户再自界说任何内存管理方法,而不是一方面作为体系极语言要给用户控制的自由,一方面本身又要抢着和用户一起控制。


因此对象层 ABI接口迟迟无法尺度化。而纯 C的 ABI不光可以轻松的跨动态库还能轻松的和汇编及各类语言融合,不是由于C计划多好,而是C作为体系层语言没有去管它不应管的东西。当年讨论到这个话题时 C++大牛们又开始重复那几句金科玉律来反驳我:“语言只是招式,你把内功练好,就能做到无招胜有招,拿草拟来都可以当剑使,C++固然有许多坑,你把计划做好不那么用不就行了”。我说:原来应该在语言层办理好的事变,由于语言逻辑不完备,将大量题目抛给开辟者去办理极大的增长了开辟者的头脑负担,就像破屋上表浆糊一样。你金庸看多了吧,武术再高,当你拿到一把枪发现子弹不肯定往前射,偶然还会今后射时,叨教你是该用心打仇人呢?照旧时候要防范本身的子弹射向本身?


体系层的挫败


C++遭受挫败是进军嵌入式和操纵体系如许靠近硬件层的东西。各人以为宇宙级别的编程语言,天然可以或许胜任统统使命,很快发现几个题目:


●无法分配内存:原来用 C可以完全不依靠内存分配,代码写几千行一个 malloc没有都行。嵌入式下处置惩罚器加电后,跳到特定地点(好比起始地点0),第一条指令一样平常用汇编来写,固定在0地点,就是简朴初始化一下栈,然后跳转到 C语言的 start函数去,试想此时内存分配机制都还没有创建,你界说了两个类,怎么构造呀?资源有限的微处置惩罚器上大部门时间就是利用一块静态内存举行操纵。C++写起来写爽了,各种隐式构造一出现,就傻了。


●尺度库依靠:在语言层面,C语言的全部特性都可以不消依靠任何库就运行,这为编写体系层和跨平台跨语言代码带来了很方便的特性。而C++就不可,我要构造呀,我要非常呀,你为啥不能给我强盛的运行时呢?什么你还想用 stl?不看看那套库有多痴肥呀(内存占用,代码尺寸)。


●非常处置惩罚题目:底层开辟必要严酷的处置惩罚全部错误返回,这一行调用,下一行就判定错误。而非常是一种疏松的错误处置惩罚方式,应用层这么写没题目,体系层这么写就很狼狈了。每行调用都try一下和 C的调用后if判定效果有什么区别?C++的构造函数是没有返回值的,假如构造内部堕落,就必须欺压你catch构造函数的非常,即便你catch住了,构造非常的时间固然会主动触发相干内部对象的析构,但是有许多并没有析构的资源(好比体系资源,好比C接口的资源,他们都没有一个析构),整个过程是很难控制的,此时这个实例是一个半初始化实例,你该怎么处置惩罚它呢?于是有人把初始化代码移除构造函数,构造时只初始化一下变量,新增长一个带返回的init函数,如许的代码写的比C冗余许多。况且硬件停止发生时,在你不知道的环境下,同事调到一些第三方的库,你最外层没有把新的exception给 catch住,这个exception该往那里抛呀?内存不敷的时间你想抛出一个 OutOfMemoryException,但是内存已经不敷了,此时完全无本领构造这个非常又该怎么办呢?


●处置惩罚器兼容:C++的类依靠基地点+偏移地点的寻址方式,许多非 Intel系列的微处置惩罚器上只有简朴的给定地点寻址,不支持如许一条语句实现BASE+OFFSET的寻址,许多C++代码编译出来必要更多的指令来运算地点,导致性能降落许多,得不偿失。


●隐式操纵题目:C的特点是简朴直接,每行语句你都能清晰的知道会被翻译成什么样子,体系会严酷按照你的代码去实行。而用C++,好比 str1 = str2 + "Hello" + str3; 如许的语句,没几个人真的说得清晰毕竟有多少次构造和拷贝,如许的写法编写底层代码是很不负责任的,底层必要更为精致和严酷的控制,用C语言控制力更强。


固然,说道这里许多人又说,“C++原来就是 C的超集,特定的地方你完全可以按照C的写法来做呀。没人逼迫你构造类大概利用非常呀”,没错,按 Linus的说法:“想要用 C++写出体系级的良好的可移植和高效的代码,终极照旧会限于利用 C自己提供的功能,而这些功能 C都已经完善提供了,以是体系层利用 C的意义就在于在语言层清除 C++的其他特性的干扰”。


许多人都记得 Linus在 2007年由于有人问 Git为什么不消 C++开辟炮轰过一次C++。究竟上2004年 C++方兴未艾的时间,有人问 Linux内核为何不消 C++开辟,他就炮轰过一次了:




现实上,我们在1992年就实验过在Linux利用 C++了。很恶心,信赖我,用C++写内核是一个 “BLOODY STUPID IDEA”。究竟上,C++编译器不值得信托,1992年时它们更糟糕,而一些根本的究竟从没改变过:
– 整套 C++非常处置惩罚体系是 “fundamentally broken”。特殊对于编写内核而言。
– 任何语言或编译器喜好在你背后隐蔽举动(如内存分配)对于开辟内核并不是一个好选择。
– 任然可以用 C来编写面向对象代码(好比文件体系),而不必要用 C++写出一坨屎来。
总得来说,对任何盼望用 C++来开辟内核的人而言,他们都是在引入更多题目,无法象 C一样清楚的看到本身到底在写什么。




C++粉丝们在C++最火热的时间试图将 C++引入体系层开辟,但是从来没有乐成过。以是不管是嵌入式,照旧操纵体系,在靠近硬件底层的开辟中,都是清一色的 C代码,完全没有 C++的驻足之地。


应用层的反思


STL出来后,给人一种 C++可以方便开辟应用层逻辑的错觉。由于许多语言层不精密的事变,让STL来以补丁的方式完成,于是许多以为可以象写 java一样写 C++的初学者落入了一个个的坑中。好比 list.size(),在 Windows下vc的 stl是生存了 list的长度的,size()直接 O(1)返回该变量,而在gcc的 stl中,没有生存 list长度,size()将搜刮全部节点,O(n)的速率返回。


由于语言层不支持字符串,导致 std::string实现非常不同一,你拷贝构造一个字符串,有的实现是引用,才用 copy-on-write的方法引用。有的地方又是 new,有的实现又是用的内存池,有的实现线程安全,有的实现线程不安全,你完全没法说出同一个语句背面到底做了些什么(见孟岩的《Linux之父话糙理不糙》)。


再好比说我想利用 hash_map,为了跨平台(当你真正编写跨平台代码时,你很难决定目的编译器和他们的版本,想用也用不了 unordered_map),我很难指出一种唯一声明 hash_map的方法,为了包管在差别的编译器下正常的利用 hash_map,你不得不写成如许:
#ifdef __GNUC__
#ifdef __DEPRECATED
   #undef __DEPRECATED
#endif
#include
namespace stdext { using namespace __gnu_cxx; }
namespace __gnu_cxx {
   template struct hash< std::string > {
       size_t operator()( const std::string& x ) const {
         return hash< const char* >()( x.c_str() );
       }
   };
}
#else
#ifndef _MSC_VER
   #include
#elif (_MSC_VER < 1300)
   #include
   #define IHAVE_NOT_HASH_MAP
#else
   #include
#endif
#endif


#ifdef __GNUC__
using namespace __gnu_cxx;
typedef hash_map HashXXXX;
#else
using namespace stdext;
typedef hash_map HashXXXX;
#endif
假如有更好的跨平台写法,贫苦告诉我一下,着实是看不下去了。一个底子容器都让人用的那么辛劳,使得许多 C++步伐员整天都在思索各种规范,没时间真正思索下步伐计划。


由于语言层要兼容 C,又不愿象 C一样只做好体系层的工作,导致当 C++涉足应用层时,没法接受内存管理,没法支持语言层字符串,没法实现语言层底子容器。以是必要借助一些 stl之类的东西来提供便利,但 stl自己又是布满各种坑的。且不说内存占用大,步伐体积大等题目,当编译速率就够呛了。以是为什么 C++下面各人乐意重复造轮子,实现各种根本容器和字符串,导致险些每个差别的 C++项目,都有本身特定的字符串实现。就是由于各人踩了坑了,才开始以为必要本身来控制这些细节。stl的出发点是好的,但是只能简朴小步伐内里任意用一下,真是大项目用,stl就轻易把人带沟里了,以是许多大点的 C++项目都是本身实现一套雷同 STL的东西,这岂非不是违反了 stl计划的初志了么?


语言层的缺失,让各人为了满意业务开辟的快速迭代的需求,创造了许多很底子的计划机灵的基类,来提供雷同垃圾接纳,引用计数,copy-on-write,delegate,等不可胜数的功能。每个项目都有一系列 BaseObject 之类的底子类,如许就引入一个误区,两年后你再来看你的代码,发现某个 BaseObject不满意需求了,大概你和别的一个项目 merge代码时,必要归并一些根本属性。图形和GUI这些万年稳定的模子还好,应用类开辟变化多端,一旦这些计划机灵的基类不再顺应项目发展时,每每面对着全面调解的代价。


打开一个个 C++大牛们 blog,许多地方在教你 std::string的原理,必要留意的事项。map的限定,vector的原理,教你怎样实现一个 string。这就叫 “心智负担”,分散你的留意力,这是其他语言里从来见不到的征象。兵士不研究怎么上火线杀敌,每天在琢磨抢和炮的原理,整天在思索怎么用枪不会走火,用炮不会炸到本身,这战还怎么打?


以是今后几年,越来越多的人开始反思前两年C++过热所带来的题目,好比高性能网络库 ZeroMQ作者 Martin Sustrik 的:《为什么我盼望用C而不是C++来实现ZeroMQ》,好比云风的《云风的 BLOG: C 的回归》,好比引起热议的《Why C++ Is Not "Back"》。


全面被取代


2008年以后,行业竞争越来越猛烈,合法各人一边苦恼怎样进步开辟服从,一边掉到C++的各种坑里的时间,越来越多的应用开辟方案涌现出来,他们都能很好的取代 C++。各行各业的开辟者渐渐相知恨晚的发现了各种更加良好的方案:必要底层控制寻求性能的计划,各人退回到 C;而必要快速迭代的东西各人找到各种动态语言;介于性能和开辟速率之间的,有java,知乎上似乎许多黑java的,语言是有不敷,但是比起C++好许多,没那么多坑,真正思量面向对象,真正让人把心思放在计划上。以是再黑也不能挡住 java在 tiobe上和 C语言不是第一就是第二的究竟,再黑也挡不住 java在云盘算,分布式范畴的杰出贡献。


以是2005年以后,C++处在一个全面被取代的过程中:






●底层体系:进一步回归 C语言,更强的控制力,更准确的操纵。
●网页开辟:2006年左右,C++和 fastcgi就被一起赶出 web天下了。
●高性能服务:varnish, nginx, redis 等新的高性能网络服务器都是纯C开辟的。
●分布式应用:2007年左右, C++被java和其他动态语言彻底赶跑。
●游戏服务端:2008年后进一步进化为 C 和 脚本,完全看不到胖C++服务端了。
●并行盘算:2010年后,go, scala, erlang;而能方便同go接口的,是 C不是C++。
●游戏引擎:没错 C++和脚本,但是这年初越来越多的开源引擎下,引擎类需求越来越少。
●游戏逻辑:脚本
●多媒体:SDL纯C,ffmpeg是纯 C,webrtc的焦点部门(DSP, codec)是纯C的。
●移动开辟:从前C++还可以开辟下塞班,如今根本被 java + objc + swift 赶跑了。
●桌面开辟:Qt+Script, C#等都能做出美丽的跨平台界面。且界面脚本化趋势,不必要C++了。
●网页前端:JavaScript, Html5, Flash
●操纵体系:FreeBSD, Open Solaris, Linux, RTOS, Darwin(OS X 底层),都是纯 C
●假造技能:qemu / kvm (云盘算的基石)纯 C,Xen 纯 C
●数据库:MySQL (焦点纯C,外围工具 C++),SQLite 纯 C, PostgreSQL / BDB / unqlite 纯C
●编译器:C/C++并存,不外编译器用脚本写都不要紧,我还在某平台用 java写的 C/C++编译器
●大数据:kafka, hadoop, storm, spark 都利用 Java / Jvm 系列技能
●云存储:openstack swift python, hdfs java, 另有很多多少方案用 go


可以看出,即便 C++的老本行,GUI和图形(确实也还存在一些短期内 C++无法替换的范畴,就像生意业务体系里另有 COBOL一样),这年初也面对的越来越多的挑衅,好比新发布的 Rust (怎样对待 Rust 的应用远景? – 知乎用户的答复)。可以发现,开辟技能多元化,用最得当的技能开辟最得当的应用是将来的趋势。而为这些差别的技能编写高性能的可控的公共组件,并轻松的和其他语言接口,正是 C语言的刚强。以是不管应用层语言变化多端,对体系级开辟语言C的需求照旧那么的稳固,而这个过程中,那里另有 C++的影子呢?


话题总结


以是说将来的趋势是:C x 各种语言混搭 的趋势,从TIOBE上 C++的指数十年间下跌了三倍可以看出,将来还会涌现出更多技能来取代各个角落残存的C++方案,C++的利用环境还会进一步降落。以是题主问学习纯C是否有前程,我以为假如题主可以或许左手纯熟的把握 C语言,造就体系化的头脑风俗和准确控制内存和硬件的本领;右手继承学习各种新兴的开辟技能,可以或许应对各个细分范畴的快速开辟,遇到新题目时能左右开弓,那么将来工作上肯定是能上一个大台阶的。至于C++ 嘛,偶然间看看就行,逼不得已要维护别人代码的环境下写两行即可。


故事分享


古代用弓箭举行远间隔攻击时,对射手要求较高,对准难度大,必要不停使劲保持准心。战斗中一个弓箭手开弓二十次就必要比力长的苏息时间。弩的威力远胜于弓,秦弩的制作育如当代的主动步枪一样平常细密无二,它既可以延伸射击,又可以准确对准。弩箭的发射速率更是弓箭的数倍,威力惊人。由于弩的操纵非常简朴,不必要射击本领,布衣很轻易把握它的利用方法。秦国靠着弩兵,在战役中取得了不少上风,被人称为 “虎狼之师”。


日本降服佩服时,天皇下罪己诏。许多士兵不肯意信赖这时真的,找种种来由拒绝信赖。有的士兵乃至以为天皇的广播是仇人诱降的把戏,于是躲到森林里继承成群结队的网络谍报,打击可以攻击的目的,等候上司来给他们下达新下令。直到好几年后看到四周的人都穿着一样平常的便装了,而来巡山的 “仇人” 也从士叛乱为了巡逻队,他们都还以为这是仇人的伪装。而同时,德国败北时,末了的党卫军不停战斗到 1957年才肯降服佩服。


—————————————–

许多人以为 java慢,C++快java 10倍以上已经是上世纪的事变了,当代的 java 只比 C/C++慢 70%,C++连1倍都快不了 java。也不要以为动态语言慢,javascript只比C/C++慢 2.7倍。luajit只比 C++慢 5.8倍。在 jit技能发展的本日,C++在性能上离动态语言/java的差距越来越小,可易用性和生产服从上的差距,却和动态语言/java 比起来越来越大。





—————————
末了,增补一张图:








来自:Skywind Inside
作者:skywind
链接:http://www.skywind.me/blog/archives/1398

clg845958 发表于 2018-9-19 21:24:44

论坛有你更精彩!

奔跑的迷鹿 发表于 2018-9-20 20:25:42

楼主加油,我们都看好你哦。

zhengliu20 发表于 2018-9-20 21:13:55

加油,加油,不要沉下去,我是最热贴

mini042701 发表于 2018-9-21 20:16:29

真是被感动的痛哭流涕……

fei哥 发表于 2018-9-22 23:12:32

加油,加油,不要沉下去,我是最热贴

外向的孤独患者 发表于 2018-9-26 21:15:43

看到这帖子真是高兴!

lan123ping 发表于 2018-9-27 22:56:00

绝对干货,楼主给力,支持了!!!

@Xizi_IzY59c6B 发表于 2018-9-28 23:43:44

真是难得给力的帖子啊。

如浪 发表于 2018-9-29 14:19:13

无私奉献,好工控人,32个赞送给你!!
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: C++的反思