怎么样提高c++的加法小米手机性能怎么样 博客

大数加法、乘法以及阶乘的实现(c/c++)
80add()mult()58
//用于转置字符串
Reverse(char* a)
size1=strlen(a)-1;
size2=(size1+1)/2;
i=0;i&size2;i++)
temp=a[i];
a[i]=a[size1-i];
a[size1-i]=
char* Add(char* a,char* b)
& int maxlen = max(strlen(a),strlen(b));
//多申请两个字符,一个是结束符'\0',一个是放到第一个字符,当两个数最高位相加后,如果有进位,保存到这里
& char* p = new char[maxlen+2];
& //声明两个指针分别指向a和b的末尾,不包含结束符 &
& char* pA=a+strlen(a)-1; &
& char* pB=b+strlen(b)-1; &
& int m=0; &
& int n=0; &
& //进位 &
& int c=0;&
& int i=0;
& for (i=0;i&i++)
& & & m = n = 0;
//因为当pA到达第一个字符时,即pA=a时,也要进行计算,所以这里用(pA-1)来判断 &
//因为字符'0'的Asic是48,所以1就是49,要转成数字,就要减去48 &
& & & if ((pA+1)
& & m = *pA - 48;
& & pA--; &
& & & if ((pB+1)
& & n = *pB - 48;
& & pB--; &
//为p指针的第i个字符赋值 &
& & & *(p+i) =
(m+n+c) % 10 + 48;
& & & //取得进位
(m+n+c) / 10; &
//判断最后一位是否有进位
*(p+i) = 48 +
*(p+i+1) = '\0';
*(p+i) = '\0';
//转置字符串
Reverse(p);
乘法的实现:&
char* Mult(char* a,char* b)
int sizea =strlen(a);
int sizeb =strlen(b);
char* p = new
char[sizea+sizeb+1];&
//两数相乘所得的积的位数最大为两个数位数只和,多申请一位放'\0'
char* pA=a+sizea-1;
& & & char*
pB=b+sizeb-1; &
& & & int m=0;
& & & int n=0;
& & & //进位
//存放该位置原有的数
//具体实现过程详见说明文件
(i=0;i&i++)
*(pA-i) - 48; &
(j=0;j&j++)
n = *(pB-j) -
//判断该位置原来是否为0
if((*(p+i+j)&='0')&&(*(p+i+j)&='9'))
s = *(p+i+j) - 48;
*(p+i+j) = (m*n+c+s) % 10 +
c = (m*n+c+s) /
*(p+i+j) = 48 +
*(p+i+j) = '\0';
*(p+i+j-1) = '\0';
Reverse(p);
阶乘实现:&
char* Factorial(int num)
char* pt="1";
//调用num次Mult()
i=2;i&=i++)
str=Add(str,"1");
pt=Mult(pt,str);
5+7=1212 214+4=81=9
new char[maxlen+2];
//maxlen+2'\0'
99+99=1981
pA=a+strlen(a)-1;&
pB=b+strlen(b)-1;&
Reverse(char* a);123456771317263537654321
for (int i=0;i&size2;i++)
&&&&&&&&&&&&&
temp=a[i];
&&&&&&&&&&&&&
a[i]=a[size1-i];
&&&&&&&&&&&&&
a[size1-i]=
4*1234567char* pp
30*1234567p
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&
if((*(p+i+j)&='0')&&(*(p+i+j)&='9'))
&&&&&&&&&&&&&&&&&&&&&&&&&&&
s = *(p+i+j) - 48;
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&
30*1234567p00
char* Factorial(int num)
char* pt="1";
char* str="1";
for (int i=2;i&=i++)
&&&&&&&&&&&&&
str=Add(str,"1");
pt=Mult(pt,str);//
结果展示:
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。&&&& 摘要: OpenCASCADE General Transformation
Abstract. OpenCASCADE provides a general transformation class: gp_GTrsf. It can be a transformation from gp, an affinity, or you can define your own tr...&&&&&& 摘要: 测试机: amd 两核心 ,客户端与服务端都在本机上跑。网络层:A类epoll线程处理accept的被动连接;B类epoll线程处理connect的主动连接;C类epoll线程把A或B类epoll线程得到的连接分配到某个线程,专门处理send和recv操作;D类线程池处理C类抛出来的数据,处理完之后,再投递到C类线程做send操作。用ab测试短连接ab -n 1000 -c 150 http://...&&&&&& 摘要: &&脚本概述
&&&nginx是一款著名的开源web服务器,为方便升级与恢复,编写了一个简单的脚本,因为升级备份了可执行文件和配置文件(后缀名为old),所以可用于恢复。当升级时,若nginx正在运行,则不中断服务进行平滑升级,否则直接拷贝覆盖;当恢复时,若nginx正在运行,则不中断服务进行平滑恢复,否则直接拷贝覆盖。是否正在运行根据pid来判...&&&&&& 摘要: Iterate Files by Tcltk
Abstract. Tcl/Tk provide a programming system for developing and using graphical user interface(GUI) applications. Tcl stands for “tool command language&#822...&&&&&& 摘要: AutoCAD File Merger
Abstract. There are many drawing files during the ship design or other design process, so somebody want to merge them to one DWG file. The DwgMerger is a AutoCADE plu...&&&&&& 摘要: 2.1 RFC5766/TURN & TURN,在RFC5766中定义,英文全称Traversal Using Relays around NAT(TURN):Relay Extensions to Session Traversal Utilities for NAT(STUN),即使用中继穿透NAT:STUN的中继扩展。简单的说,TURN与STUN的共同点都是通过修改应用层中的私网地...&&&&&& 摘要: 项目中和自己代码中大量使用了STL的容器,平时也没怎么关注alloc的具体实现细节,主观认识上还停留在侯捷大师的《STL源码剖析》中的讲解。
但是目前编译器的实现,早已经不是书中所言……&&I tried to use NSMutableAttributedString to show a reach text in UILabel, but I found it's hard to find out a way to find out the range of the-string inside of a string. Here is what that I've done.hope this helped you!let&attrString&=&NSMutableAttributedString(string:desc)&&&&&&&&if&let&strRange&=&&desc.rangeOfString(stringInSearchBar){&&&&&&&&&&&&let&distanceBegin&=&distance(desc.startIndex,&strRange.startIndex)&&&&&&&&&&&&let&distanceEnd&=&distance(desc.startIndex,&strRange.endIndex)&&&&&&&&&&&&let&range&=&NSMakeRange(distanceBegin,&distanceEnd&-&distanceBegin)&&&&&&&&&&&&attrString.addAttribute(NSForegroundColorAttributeName,&value:&UIColor.markColorRed(),&range:range)&&&&&&&&}&&&& 摘要: Qt Undo Framework Demo
Abstract. Qt’s Undo Framework is an implementation of the Command Pattern, for implementing undo/redo functionality in applications. The Command pattern is b...&&&&&& 摘要: VS允许引用临时对象,而gcc则禁止引用临时对象。比如:Code highlighting produced by Actipro CodeHighlighter (freeware)/-->int&a&=&100;int&b&=&200;int&&c&nbsp...&&&&&& 摘要: Code highlighting produced by Actipro CodeHighlighter (freeware)
/
-->&1&
&2&#include&"libpq-fe.h"
&3&
&4&#include&nbs...&&&&&& 摘要: 序言
虽然nginx+lua开发一些小的web服务简单快捷,但是由于种种原因,配套的工具比较缺乏,监控工具和性能检测工具等等。而且lua作为一种跑在虚拟机的脚本语言,虽然做的短小精悍,但是。。。功能和可调优的空间还是欠缺了点。
前段时间使用春哥的systemtap脚本对我的lua服务做了下性能测试,这里记录一下折腾的历程
准备
systemtap是一个性能检测和调试跟踪的工具,最开始是为了...&& 本来我都忘记了,结果有网友提醒我要写,我就来写一写。
现在的年终总结已经没什么内容了,主要是GacUI (www.gaclib.net)的开发实在太漫长。我现在在做拖控件程序GacStudio,希望在做完之后可以有Blend编辑WPF的效果,在xml里面写data binding的时候不同的地方会有不同的intellisense。这当然是很难的,所以才想做。因此今年就把GacUI做到可以有Control Template、Item Template、Data Binding、XML Resource和加载,于是终于可以开始做GacStudio了。GacStudio整个会使用GacUI推荐的Data Binding来写。这有三个好处:1、检验Data Binding是否设计的好顺便抓bug;2、检验性能;3、证明GacUI是屌的,大家都可以用。
我还在github开了一个数据库项目,在/vczh/herodb,不过因为现在没有台式机,笔记本太烂装不了Ubuntu的虚拟机,所以暂停开发,等到我设备到了我再继续写。这个东西写完之后会合并进GacUI作为扩展的一部分,可以开很多脑洞,这个我就不讲了。
我觉得2014年最伟大的成就就是,我终于搬去西雅图了,啊哈哈哈哈。&&&& 摘要: Chinese readers annotation:这个问题google,stackoverflow,github都还没有相关资料,所以把内容写成英文的,以便于帮助国外的朋友。English readers annotation:This problem has not been found by google or stackoverflow or github yet. So I write...&&&&&& 摘要: 之前遇到过的问题-布尔变量初始值 ,最近又遇到了。重新整理一下bool在VS2010中的未初始化时候的值:
CTRL+F5:执行
FALSE
&可以看到DEBUG下,未初始化bool变量的值是可以预知的。而RELEASE下,行为...&&&&&& 摘要: OpenCASCADE Hidden Line Removal
Abstract. To provide the precision required in industrial design, drawings need to offer the possibility of removing lines, which are hidden in a given pr...&&&&&& 摘要: python 3.xCode highlighting produced by Actipro CodeHighlighter (freeware)/-->&1&#!/usr/bin/python&2&#&Filename:&ipaInfo3.py&3&#&n...&&&&&& 摘要: Code highlighting produced by Actipro CodeHighlighter (freeware)/-->class&Widget&:&public&QWidget{&&&&Q_OBJECTpublic:&&&...&&&&&& 摘要: 内存中的储存形式(IEEE-745)
Address 3 & & & &2 & & & &1 & & & &0 Content SEEEEEEE EBBBBBBB BBBBBBBB BBBBBBBB
其中的字母分别代表:
S(Significand):1 -...&&好久没写了,上来先问一个问题。。。羞射。。。 & 有 A、B 两个窗口,A 是 B 的 Owner,B 不激活不抢焦点。在 B 的 WM_LBUTTONDOWN 的时候,设置 A 窗口为 Capture;在& A 的 WM_LBUTTONUP 的时候 ReleaseCapture。 操作是,在 B 上按下鼠标,然后一直按住鼠标飘啊飘。在某一时机把 B 干掉,继续动鼠标。此时 A 还在,并且 A 仍然是 Capture 状态,但是 A 收不到 A 可视范围外的 WM_MOUSEMOVE 了!在全过程中 A 也没有收到 WM_CAPTURECHANGED。 & 下面是栗子:
& 求解释。求解决。谢谢~!&&&& 摘要: 编码习惯及设计基础
程序员修炼之道 /9053091.html 这本书讲解的一些设计原理很实用, 对设计感兴趣的同学可以一看 推荐指数: 5星 图形渲染, 客户端
3D绘图程序设计 /.html 推荐指数: 3星
Unity3D游戏开发 http://product.d...&&&&&& 摘要: A Simple OpenCASCADE Qt Demo-occQt
Abstract. OpenCASCADE have provided the Qt samples in the samples directory, but they are a little complicated. So I decide write a simple OpenCASCADE ...&&&&&& 摘要: &&&本文描述了一种简单的跨平台锁框架的设计与实现,该框架小巧实用、易于扩展,它的特点如下:& & &● 实现了线程间互斥锁& & &● 实现优化了单线程环境中的空锁和空级别锁& & &● 支持编译时或运行时选择锁& & &...&&&&&& 摘要: OpenCASCADE JT Assistant
Abstract. Siemens’ JT data format accepted as the world’s first ISO international standard for viewing and sharing lightweight 3D product information...&&Unity3D默认的asset格式都是二进制的, 比如说.anim .mat .prefab .unity 还有一些是文本格式, 比如.meta. 因此在菜单Edit-&Project Settings-&Editor里的Asset serialization模式是混合. 为了让代码管理工具能识别Unity3D的asset格式, 做出一些少量的合并及识别修改. 我们需要对Unity3D进行一些配置以适应代码管理工具.以下是步骤: Edit-&Project Settings-&Editor里按如下配置
在做出修改前, 请将之前的修改提交代码管理 将选项设为红框内的方式, 使用显式Meta Files, 以避免在资源管理器里被被忽略的meta文件以及Asset文件使用文本格式 设定好后, 所有的资源将重新序列化, 将修改提交代码管理工具 & 代码管理工具不是玩能的, 也一定能很好的合并这些复杂文本格式. 因此我们在多人协作开发中需要遵守一些原则 1. 先获取别人的更新, 运行无误后再提交( 最基本的 ) 2. 对有合并的asset格式, 尽量查看其修改过程, 询问他人的修改与自己的修改差异(或者是git的3方合并) 3. 对合并错误的asset格式, 应及时修正, 手动合并, 切勿延误并提交, 影响他人 参考链接: import&itertoolsfor&x&in&itertools.product([1,2,3,4],[2,3,4],[1,1,2,2,]):&&&&print&x&&&& 摘要: AVEVA PMLNet Guide
Abstract. AVEVA PMLNet allows you to instantitate and invoke methods on .NET objects from PML proxy objects. The PML proxy objects behave just like any other PML objec...&&&&&& 摘要: 背景
前段时间项目需要一个点击服务,大致是要根据用户请求的url及数据库中的规则,匹配出一个结果并记录日志。最开始是一个很小的需求,结果业务越来越复杂,业务逻辑中经常要处理header头和一些其他的信息,导致代码越来越混乱。在一期结束之后,抽时间把这段时间的工作抽象出了一个轻量级框架,只做了适量的封装,加入了代码生成的模块,可以帮助开发者迅速做出一个可用的web服务。
介绍
dodolu框架...&&&&&& 摘要: OpenCASCADE View Manipulator
Abstract. When you finish modeling objects in the scene, you must want to use some operations to view the scene objects, such as Pan, Zoom and Rotate the sce...&&&&&& 摘要: & & (忘记说了 -- 此法有危险,记得备份所有资料。。。)
& & OSX升级到10.10.1后,突然发现在OSX下看不到Bootcamp设备了。想来这半个月就用过三次Win8.1,而且也没做啥过分的操作,怎么就看不见了呢?
& & 折腾一下午,还是没有搞定,但发现一片好文...&&
技 术 改 变 世 界
24小时内最热随笔
Blog客户端API
推荐客户端
博客排行榜[前100人]
1.&&( 14:25,1456154)2.&&(341,01-09 07:01,1322935)3.&&(868,10-22 15:00,880955)4.&&(726,08-18 08:47,803748)5.&&( 10:04,733863)6.&&(503,01-13 18:08,640676)7.&&(405,09-07 22:31,603470)8.&&(114,12-03 22:07,530739)9.&&(204,10-19 10:06,490952)10.&&(413,01-05 17:23,455331)11.&&(214,12-31 09:21,408928)12.&&(148,01-13 14:23,405042)13.&&(146,12-14 13:55,399930)14.&&(224,10-23 18:40,399411)15.&&(347,01-10 00:50,350945)16.&&(183,01-02 15:51,342018)17.&&(278,01-03 10:43,333543)18.&&(135,12-02 21:13,322958)19.&&(158,01-04 13:09,319721)20.&&(245,01-22 20:52,301205)21.&&(239,01-23 16:10,293712)22.&&(241,09-18 19:12,286807)23.&&(114,12-28 21:17,264880)24.&&(139,12-26 15:09,262838)25.&&(239,01-01 00:41,240158)26.&&(84,01-10 15:19,234437)27.&&(288,09-10 18:09,232401)28.&&(59,12-03 01:50,230982)29.&&(127,11-30 19:54,200464)30.&&(301,10-31 15:54,199343)31.&&(101,09-03 10:32,181291)32.&&(252,01-20 16:55,181069)33.&&(133,12-21 21:01,179423)34.&&(29,10-22 20:59,178825)35.&&(256,01-14 13:55,154496)36.&&(151,01-09 10:36,149111)37.&&(68,01-22 11:50,147912)38.&&(267,11-14 08:58,141487)39.&&(236,01-17 16:08,141145)40.&&(126,10-30 10:19,124204)41.&&(87,08-14 09:34,113032)42.&&(63,01-03 12:58,110473)43.&&(15,12-28 16:03,105505)44.&&(225,01-21 16:48,104542)45.&&(63,01-23 21:24,103660)46.&&(57,01-20 17:40,100114)47.&&(51,10-10 14:15,98501)48.&&(80,08-28 22:48,93164)49.&&(314,11-07 21:44,91866)50.&&(120,10-25 15:31,89458)51.&&(23,01-15 19:23,89229)52.&&(49,01-14 12:00,88922)53.&&(84,01-01 23:37,79614)54.&&(357,12-07 21:28,76965)55.&&(85,01-07 11:58,73075)56.&&(69,11-10 13:25,71303)57.&&(75,12-22 00:47,69328)58.&&(86,01-13 14:48,65790)59.&&(36,09-02 20:37,62380)60.&&(139,01-20 19:35,60302)61.&&(73,01-23 09:53,56544)62.&&(148,01-19 19:34,55872)63.&&(23,01-18 11:40,55800)64.&&(19,09-19 19:55,54700)65.&&(88,12-18 13:03,54644)66.&&(200,01-13 20:34,51839)67.&&(31,11-03 07:18,50765)68.&&(32,08-27 13:29,48971)69.&&(14,01-08 16:17,48894)70.&&(22,08-07 12:06,47270)71.&&(32,08-13 13:50,46210)72.&&(20,12-04 09:36,44170)73.&&(13,09-24 12:46,42902)74.&&(54,09-24 09:17,41218)75.&&(29,01-08 15:05,38601)76.&&(64,11-11 20:53,37900)77.&&(14,10-30 19:46,36573)78.&&(7,09-23 00:38,36352)79.&&(47,09-15 13:44,35214)80.&&(52,01-24 22:47,34855)81.&&(69,09-17 10:05,34792)82.&&(70,01-16 17:21,34511)83.&&(22,12-03 15:13,34119)84.&&(67,09-21 12:13,33036)85.&&(53,08-30 14:05,33003)86.&&(35,12-11 16:11,28649)87.&&(33,01-10 17:07,26825)88.&&(34,01-10 16:16,26355)89.&&(40,01-25 13:07,25065)90.&&(11,01-02 15:46,22518)91.&&(31,08-22 14:59,21856)92.&&(13,09-16 09:54,18400)93.&&(41,12-08 00:01,17515)94.&&(28,10-12 11:50,16947)95.&&(21,12-10 10:58,16711)96.&&(7,11-06 05:06,16368)97.&&(17,10-11 11:38,15339)98.&&(15,11-13 21:54,14452)99.&&(45,08-27 10:37,14075)100.&&(8,01-09 12:18,13817)
版权所有. 保留所有权利先说明一下,我不希望本文变成语言争论贴。希望下面的文章能让我们客观理性地了解C++这个语言。(另,我觉得技术争论不要停留在非黑即白的二元价值观上,这样争论无非就是比谁的嗓门大,比哪一方的观点强,毫无价值。我们应该多看看技术是怎么演进的,怎么取舍的。)
周五的时候,我在我的微博上发了一个贴说了一下一个网友给我发来的C++程序的规范和内存管理写的不是很好(后来我删除了,因为当事人要求),我并非批判,只是想说明其实程序员是需要一些&疫苗&的,并以此想开一个&程序员疫苗的网站&,结果,@简悦云风同学:&不要用 C++ 直接用 C , 就没那么多坑了。&就把这个事带入了语言之争。
&:&说C++比C的坑更多的人我可以理解,但理性地思考一下。C语言的坑也不少啊,如果说C语言有90个坑,那么C++就是100个坑(另,我看很多人都把C语言上的坑也归到了C++上来),但是C++你得到的东西更多,封装,多态,继承扩展,泛型编程,智能指针,&&,你得到了500%东西,但却只多了10%的坑,多值啊。
结果引来了更多的回复(只节选了一些言论):
@淘宝褚霸:&自从5年前果断扔掉C++,改用了ansi c后,我的生活质量大大提升,没有各种坑坑我。&
@Laruence说: &我确实用不到, C语言灵活运用struct, 可以很好的满足这些需求.//@左耳朵耗子: 封装,继承,多态,模板,智能指针,这也用不到?这也学院派?//@Laruence: 问题是, 这些东西我都用不到& C语言是工程师搞的, C++是学院派搞的&
那么,C++的坑真的多么?我还请大家理性地思考一下。
C++真的比C差吗?
我们先来看一个图&&《》,从这个图上看,C程序员比C++的程序员在注释中使用fuck的字眼多一倍。这说明了什么?我个人觉得这说明C程序员没有C++程序员淡定。
不要太纠结上图,只是轻松一下,我没那么无聊,让我们来看点真正的论据。
相信用过C++的程序员知道,C++的很多特性主要就是解决C语言中的各种不完美和缺陷:(注:C89、C99中许多的改进正是从C++中所引进的)
用namespace解决了很C函数重名的问题。
用const/inline/template代替了宏,解决了C语言中宏的各种坑。
用const的类型解决了很多C语言中变量值莫名改变的问题。
用引用代替指针,解决了C语言中指针的各种坑。这个在Java里得到彻底地体现。
用强类型检查和四种转型,解决了C语言中乱转型的各种坑。
用封装(构造,析构,拷贝构造,赋值重载)解决了C语言中各种复制一个结构体(struct)或是一个数据结构(link, hashtable, list, array等)中浅拷贝的内存问题的各种坑。
用封装让你可以在成员变量加入getter/setter,而不会像C一样只有文件级的封装。
用函数重载、函数默认参数,解决了C中扩展一个函数搞出来像func2()之类的ugly的东西。
用继承多态和RTTI解决了C中乱转struct指针和使用函数指针的诸多让代码ugly的问题。
用RAII,智能指针的方式,解决了C语言中因为出现需要释放资源的那些非常ugly的代码的问题。
用OO和GP解决各种C语言中用函数指针,对指针乱转型,及一大砣if-else搞出来的ugly的泛型。
用STL解决了C语言中算法和数据结构的N多种坑。
(注意:上面我没有提重载运算符和异常,前者写出来的代码并不易读和易维护(参看《》后面的那个示例),坑也多,后者并不成熟(相对于Java的异常),但是我们需要知道try-catch这种方式比传统的不断地判断函数返回值和errno形成的大量的if-else在代码可读性上要好很多)
上述的这些东西填了不知有多少的C语言编程和维护的坑。少用指针,多用引用,试试autoptr,用用封装,继承,多态和函数重载&& 你面对的坑只会比C少,不会多。
C++的坑有多少?
C++的坑真的不多,如果你能花两到三周的时候读一下《》里的那50多个条款,你就知道C++里的坑并不多,而且,有很多条款告诉我们C++是怎么解决C的坑的。然后,你可以读读《》和《》,你可以了解一下C++各种问题的解决方法和一些常见的经典错误。
当然,C++在解决了很多C语的坑的同时,也因为OO和泛型又引入了一些坑。消一些,加一些,我个人感觉上总体上只比C多10%左右吧。但是你有了开发速度更快,代码更易读,更易维护的500%的利益。
另外,不可否认的是,C++中的代码出了错误,有时候很难搞,而且似乎用C++的人会觉得C++更容易出错?我觉得主要是下面几个原因:
C和C++都没学好,大多数人用C++写C,所以,C的坑和C++的坑合并了。
C++太灵活了,想怎么搞就怎么搞,所以,各种不经意地滥用和乱搞。
另外,C++的编译对标准C++的实现各异,支持地也千差万别,所以会有一些比较奇怪的问题,但是如果你一般用用C++的封装,继承,多态,以及namespace,const, refernece, &inline, templete, overloap, autoptr,还有一些OO 模式,并不会出现奇怪的问题。
而对于STL中的各种坑,我觉得是程序员们还对GP(泛型编程)理解得还不够,STL是泛型编程的顶级实践!属于是大师级的作品,一般人很难理解。必需承认STL写出来的代码和编译错误的确相当复杂晦涩,太难懂了。这也是C++的一个诟病。
这和&&& &C++是一门很恐怖的语言,而比它更恐怖的是很多不合格的程序员在使用着它&。注意我飘红了&很多不合格的程序员&!
我觉得C++并不适合初级程序员使用,C++只适合高级程序员使用(参看《》和《》),正如《》中说的,C++适合那些对开发维护效率和系统性能同时关注的高级程序员使用。
这就好像飞机一样,开飞机很难,开飞机要注意的东西太多太多,对驾驶员的要求很高,但你不能说飞机这个工具很烂,开飞机的坑太多。(注:我这里并不是说C++是飞机,C是汽车,C++和C的差距,比飞机到汽车的差距少太多太多,这里主要是类比,我们对待C++语言的心态!)
理解C++设计的最佳读本是《》,在这本书中Stroustrup说了些事:
1)Stroustrup对C是非常欣赏,实际上早期C++许多的工作是对于C的强化和净化,并把完全兼容C作为强制性要求。C89、C99中许多的改进正是从C++中所引进。可见,Stroustrup对C语言的贡献非常之大。今天不管你对C++怎么看,C++的确扩展和进化了C,对C造成了深远的影响。
2)Stroustrup对于C的抱怨主要来源于两个方面&&在C++兼容C的过程中遇到了不少设计实现上的麻烦;以及守旧的K&R C程序员对Stroustrup的批评。很多人说C++的恶梦就是要去兼容于C,这并不无道理(Java就干的比C++彻底得多),但这并不是Stroustrup考虑的,Stroustrup一边在使尽浑身解数来兼容C,另一方面在拼命地优化C。
3)Stroustrup在书中直接说,C++最大的竞争对手正是C,他的目的就是&&C能做到的,C++也必须做到,而且要做的更好。大家觉得是不是做到了?有多少做到了,有多少还没有做到?
4)对于同时关注的运行效率和开发效率的程序员,Stroustrup多次强调C++的目标是&&&在保证效率与C语言相当的情况下,加强程序的组织性;能保证同样功能的程序,C++更短小&,这正是浅封装的核心思想。而不是过渡设计的OO。(参看:)
5)这本书中举了很多例子来回应那些批评C++有运行性能问题的人。C++在其第二个版本中,引入了虚函数机制,这是C++效率最大的瓶颈了,但我个人认为虚函数就是多了一次加法运算,但让我们的代码能有更好的组织,极大增加了程序的阅读和降底了维护成本。(注:Lippman的《》也说明了C++不比C的程序在运行性能低。Bruce的《》也说C++和C的性能相差只有5%)
6)这本书中还讲了一些C++的痛苦的取舍,印象最深的就是多重继承,提出,拿掉,再被提出,反复很多次,大家在得与失中不断地辩论和取舍。这个过程让我最大的收获是&&a) 对于任何一种设计都有好有坏,都只能偏重一方,b) 完全否定式的批评是不好的心态,好的心态应该是建设性地批评。
我对C++的感情
我先说说我学C++的经历。
我毕业时,是直接从C跳过C++学Java的,但是学Java的时候,不知道为什么Java要设计成这样,只好回头看C++,结果学C++的时候又有很多不懂,又只得回头看C,最后发现,C -& C++ -& Java的过程,就是C++填C的坑,Java填C++的坑的过程。
注,下面这些东西可以看到Java在填C/C++坑:
Java彻底废弃了指针(指针这个东西,绝对让这个社会有几百亿的损失),使用引用。
Java用GC解决了C++的各种内存问题的诟病,当然也带来了GC的问题,不过功大于过。
Java对异常的支持比C++更严格,让编程更方便了。
Java没有像C++那样的template/macro/函数对象/操作符重载,泛型太晦涩,用OO更容易一些。
Java改进了C++的构造、析构、拷贝构造、赋值。
Java对完全抛弃了C/C++这种面向过程的编程方式,并废弃了多重继承,更OO(如:用接口来代替多重继承)
Java比较彻底地解决了C/C++自称多年的跨平台技术。
Java的反射机制把这个语言提升了一个高度,在这个上面可以构建各种高级用法。
C/C++没有一些比较好的类库,比如UI,线程 ,I/O,字符串处理等。(C++0x补充了一些)
当然时代还在前进,这个演变的过程还在C#和Go上体现着。不过我学习了C -& C++ &-& Java这个填坑演进的过程,让我明白了很多东西:
我明白了OO是怎么一回事,重要的是明白了OO的封装,继承,和多态是怎么实现的。(参看我以前写过的《》和《》)
我明白了STL的泛型编程和Java的各种花哨的技术是怎么一回事,以及那些很花哨的编程方法和技术。
我明白了C,C++,Java的各中坑,这就好像玩火一样,我知道怎么玩火不会烧身了。
我从这个学习过程中得到的最大的收获不是语言本身,而是各式各样的编程技术和方法,和技术的演进的过程,这比语言本身更重要!(在这个角度上学习,你看到的不是一个又一个的坑,你看到的是&&各式各样让你可以爬得更高的梯子)
我对C++的感情有三个过程:先是喜欢地要死,然后是恨地要死,现在的又爱又恨,爱的是这个语言,恨的是很多不合格的人在滥用和凌辱它。
C++语言发展大概可以分为三个阶段():
第一阶段从80年代到1995年。这一阶段C++语言基本上是传统类型上的面向对象语言,并且凭借著接近C语言的效率,在工业界使用的开发语言中占据了相当大份额;
第二阶段从1995年到2000年,这一阶段由于标准模板库(STL)和后来的Boost等程式库的出现,泛型程式设计在C++中占据了越来越多的比重性。当然,同时由于Java、C#等语言的出现和硬件价格的大规模下降,C++受到了一定的冲击;
第三阶段从2000年至今,由于以Loki、MPL等程式库为代表的产生式编程和模板元编程的出现,C++出现了发展历史上又一个新的高峰,这些新技术的出现以及和原有技术的融合,使C++已经成为当今主流程式设计语言中最复杂的一员。
在《》中说了 ,性能主要就是要省电,省电就是省钱,在数据中心还不明显,在手机上就更明显了,这就是为什么Android 支持C++的原因。所以,在NB的电池或是能源出现之前,如果你需要注重程序的运行性能和开发效率,并更关注程序的运性能,那么,应该首选 C++。这就是iOS开发也支持C++的原因。
今天的C++11中不但有更多更不错的东西,而且,还填了更多原来C++的坑。(参看:,)
C++并不完美,但学C++必然让你受益无穷。
是那些不合格的、想对编程速成的程序员让C++变得坑多。
最后,非常感谢能和&@简悦云风&,&@淘宝诸霸&,&@Laruence&一起讨论这个问题!无论你们的观点怎么样,我都和你们&在一起&,嘿嘿嘿&&
阅读(...) 评论()

我要回帖

更多关于 红米性能怎么样 的文章

 

随机推荐