




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C+W其他语言的比较在 31 年前 (1979 年 ) ,一名刚获得博士学位的研究员,为了开发一个软件项目发明了一门新编程语言,该研究员名为Bjarne Stroustrup ,该门语言则命名为一"C with classes ,四年后改称为 C+。C+是一门通用编程语言,支持多种编程范式,包括过程式、面向对象(object-oriented programming, OP)、泛型 (genericprogramming, GP) ,后来为泛型而设计的模版,被发现及证明是图灵完备的,因此使C+亦可支持模版元编程范式(template metaprogramming, TMP)。 C+
2、继承了 C的特色,既为高级语言,又含低级语言功能,可同时作为系统和应用编程语言。C+广泛应用在不同领域,使用者以数百万计。根据近十年的调查,C+的流行程度约稳定排行第 3 位 ( 于 C/Java 之后 ) 。 C+ 经历长期的实践和演化,才成为今日的样貌。1998 年,C+标准委员会排除万难,使 C+成为ISO标准(俗称C+98),当中含非常强大的标准模版库 (standard template library, STL)。之后委员会在2005 年提交了有关标准库的第一个技术报告( 简称 TR1) ,并为下一个标准C+0x 而努力。可惜C+0x 并不能在200x年完成,各界希望新标准能于20
3、11 年内出台。流行的C+编译器中,微软 Visual C+ 2010 已实现部分 C+0x语法并加入TR1扩充库,而 gcc 对 C+0x 语法和库的支持比VC2010 更多。2ZcaY。应否选择C+哪些程序适宜使用C+?C+并非万能丹,我按经验举出一些C+的适用时机。C+适合构造程序中需求较稳定的部分,需求变化较大的部分可使用脚本语言;程序须尽量发挥硬件的最高性能,且性能瓶颈在于CPU 和内存;程序须频繁地与操作系统或硬件沟通;程序必须使用C+ 框架 / 库,如大部分游戏引擎( 如 Unreal/Source) 及中间件( 如Havok/FMOD),虽然有些C+库提供其他语言的绑定,但通常
4、原生的API性能最好、最新;s6GQb。项目中某个目标平台只提供C+编译器的支持。按应用领域来说,C+适用于开发服务器软件、桌面应用、游戏、实时系统、高性能计算、嵌入式系统等。使用C+还是C?C+和C的设计哲学并不一样,两者取舍不同,所以不同的程序员和软件项目会有不同选择,难以一概而论。与 C+相比,C具备编译速度快、容易学习、显式描述程序细节、较少更新标准(后两者也可同时视为缺点)等优点。在语言层面上,C+包含绝大部分 C语言的功能(例外之一,C+没有C99的变长数组 VLA),且提供OOP和GP的特性。但其实用 C也可实现OOP 思想,亦可利用宏去实现某程度的GP,只不过C+的语法能较简洁
5、、自动地实现OOP/GP。C+的 RAII(resource acquisition is initialization,资源获取就是初始化 )特性比较独特,C/C#/Java没有相应功能。回顾历史,Stroustrup开发的早期C+编译器Cpre/Cfront 是把 C+源代码 QRLdp翻译为C,再用C编译器编译的。由此可知,C+编写的程序,都能用等效的C程序代替,但 C+在语言层面上提供了 OOP/GP语法、更严格的类型检查系 统、大量额外的语言特性(如异常、RTTI等),并且C+标准库也较丰富。有时候 C+的语法 可使程序更简洁,如运算符重载、隐式转换。但另一方面, C语言的API通常
6、比C+简洁, 能较容易供其他语言程序调用。因此,一些 C+库会提供C的API封装,同时也可供 C程序 调用。相反,有时候也会把C的API封装成C+形式,以支持 RAII和其他C+库整合等。cWXw z为何C+性能可优于其他语言?相对运行于虚拟机语言( 如 C#/Java) , C/C+ 直接以静态形式把源程序编译为目标平台的机器码。一般而言,C/C+ 程序在编译及链接时可进行的优化最丰富,启动时的速度最快,运行时的额外内存开销最少。而C/C+ 相对动态语言( 如 Python/Lua) 也减少了运行时的动态类型检测。此外,C/C+ 的运行行为是确定的,且不会有额外行为( 例如 C#/Java
7、必然会初始化变量 ) ,也不会有如垃圾收集(GC) 而造成的不确定性延迟,而且C/C+ 的数据结构在内存中的布局也是确定的。有时C+的一些功能会使程序性能优于C,当中以内联和模版最为突出,这两项功能使 C+标准库的sort()通常比C标准库的qsort() 快多倍(C可用宏或人手编码去解决此问题) 。另一方面,C/C+ 能直接映射机器码,之间没有另一层中间语言,因此可以做底层优化,例如使用内部(intrinsic)函数和嵌入汇编语言。然而,许多 C+的性能优点并非免费午餐,代价包括较长的编译链接时间和较易出错,因而增加开发时间和成本,这点稍后补充。nMiYs。我进行了一个简单全局渲染性能测试(
8、512x512 像素,每像素10000 个采样 ) , C+ 1 小时36 分、 Java 3 小时 18 分、 Python 约 18 天、 Ruby 约 351 天。CZRj3。C+常见问题C+源代码跨平台吗?C+有不错的跨平台能力,但由于直接映射硬件,因性能优化的关系,跨平台能力不及Java及多数脚本语言。然而,实践跨平台的C+ 软件还是可行的,但须注意以下问题:0TbF0。C+标准没有规定原始数据类型(如int)的大小,需要特定大小的类型时,可自订类型(如int32_t) ,同时对任何类型使用sizeof() 而不假设其大小;k8ZJu。字节序 (byte order) 按 CPU 有
9、所不同,特别要注意二进制输入输出、reinterpret_cast法;1bvPQ。原始数据和结构类型的地址对齐有差异;编译器提供的一些编译器或平台专用扩充指令;避免作应用二进制接口(application binary interface, ABI)的假设,例如调用函数时参数的取值顺序在C/C+中没定义,在 C+中也不可随便假设RTTI/虚表等实现方式。r2IYC。总括而言,跨平台C+软件可在头文件中用宏检测编译器和平台,再用宏、 typedef 、自定平台相关实现等方法去实践跨平台,C+ 标准不会提供这类帮助。C+程序容易崩溃?和许多语言相比,C/C+ 提供不安全的功能以最优化性能,有可能造
10、成崩溃。但要注意,很多运行时错误,如向空指针/ 引用解引用、数组越界、堆栈溢出等,其他语言也会报错或抛出异( 例如程序继续把内存Chrome 或使用 代替 C 字符串;以 ) ;使用智能指针也常,这些都是程序问题,而不是语言本身的问题。有些意见认为,出现这类运行时错误,应该 尽量写入日志并立即崩溃,不该让程序继续运行,以免造成更大的影响中错误的数据覆写文件) 。若要容错,可按业务把程序分割为多进程,像fork() 的形式。然而,C+ 有许多机制可以减少错误,例如以stringvector 或 array(TR1) 代替原始数组( 有些实现可在调试模式检测越界能减少一些原始指针的问题。另外,我最
11、常遇到的Bug ,就是没有初始化成员变量,有时会导致崩溃,而且调试版和发行版的行为可能不同。fdLZHC+要手动做内存管理?C+同时提供在堆栈上的自动局部变量,以及从自由存储(free store)分配的对象。对于后者,程序员需手动释放,或使用不同的容器和智能指针。C+ 程序员经常进一步优化内存,自定义内存分配策略以提升效能,例如使用对象池、自定义的单向/ 双向堆栈区等。虽然C+0x还没加入GC功能,但也可以自行编写或使用现成库。此外, C/C+也可以直接使用操作系统提供的内存相关功能,例如内存映射文件、共享内存等。4Vl37。使用C+常要重造轮子?我曾参与的C+ 项目,都会重造不少标准库已提
12、供的功能,此情况在其他语言中较少出现。我试图分析个中原因。首先,C+标准库相对很多语言来说是贫乏的,各开发者便会重复地制造自订库。从另一个角度看,C+标准库是用C+编写的(很多其他语言不用自身而是用C/C+去编写库) ,在能力和性能上,自订库和标准库并无本质差别;另外,标准库为通用而设,对不同平台及多种使用需求作取舍,性能上有所影响,例如EA 公司就曾发表自制的EASTL 规格,描述游戏开发方面对STL的性能及功能需求的特点;此外,多个C+库一起使用,经常会因规范不同而引起冲突,又或功能重叠,所以项目可能须自行开发,或引入其他库的概念或实现 ( 如 Boost/TR1/Loki) ,改写以符合
13、项目规范。r2wxM。C+编译速度很慢?错,是非常慢。我认为C+可能是实用程序语言中编译速度最慢的。此问题涉及C+沿用C的编译链接方式,又加入了复杂的类/ 泛型声明和内联机制,使编译时间倍增。在C+ 对编译方法改革之前( 如 module 提案 ) ,可使用以下技巧改善:第一,使用pimpl 手 D3tLC。法,因性能损耗应用于调用次数不多的类;第二,仅包含必要头文件,并尽量使用及提供前置声明版本的头文件( 如 iosfwd) ;第三采用基于接口的设计,但须注意虚函数调用成本;第四,采用unity build ,即把多个cpp 文件结合在一个编译单元进行编译;第五,采用分布式生成系统如Incr
14、ediBuild 。 nH3zR。C+缺乏什么功能?虽然C+已经非常复杂,但仍缺少很多常见功能。C+0X作出了不少改善,例如语言方面加入 Lambda 函数、闭包、类型推导声明等,而库方面则加入正则表达式、采用哈希表的unordered_set/unordered_map、引用计数智能指针shared_ptr/weak_ptr 等。但最值得留点的是 C+0X一弓I入多线程的语法和库功能,这是C+武进的一大乐。然而,模组、GC、反射机制等功能虽有提案,却未加进 C+0X。VHIYuC+使用建议为应用挑选特性集我同意Stroustrup关于使用C+各种技术的回应:彳尔可以做,不意味着你必须这么做。
15、(Just because you can do it, doesn't mean that you have to.)”C+充满丰富的特性,但同时带来不同问题,例如过分复杂、编译及运行性能的损耗。一般可考虑是否使用多重继承、异常、RTTI ,并调节使用模版及模版元编程的程度。使用过分复杂的设计和功能,可能会令部分团队成员更难理解和维护。wkAKn。为团队建立编程规范C+的编码自由度很高,容易编写风格迥异的代码,C+本身也没有定义一些标准规范。而且,C+的源文件物理构成,较许多语言复杂。因此,除了决定特性集,每个团队应建立一套 编程规范,包括源文件格式( 可使用文件模版) 、花
16、括号风格。gsLec。尽量使用C+ 风格而非C 风格由于C+有对C兼容的包袱,一些功能可以使用C风格实现,但最好使用C+提供的新功能。最基本的是尽量以具名常量、内联函数和泛型取代宏,只把宏用在条件式编译及特殊情况。旧式的C要求局部变量声明在作用域开端,C+则无此限制,应把变量声明尽量置于邻近其使用的地方,for() 的循环变量声明可置于for 的括号内。C+ 中能加强类型安全的功能应尽量使用,例如避免“ 万能 ” 指针 void * ,而使用个别或泛型类型;用bool 而非 int 表示布尔值;选用4 种 C+ cast 关键字代替简单的强制转换。RRdkH。结合其他语言如前文所述,C+并非适
17、合所有应用情境,有时可以混合其他语言使用,包括用C+扩展其他语言,或在C+ 程序中嵌入脚本语言引擎。对于后者,除了使用各种脚本语言的专门API ,还可使用 Boost 或 SWIG 作整合。2ee8j。C+学习建议C+缺点之一,是相对许多语言复杂,而且难学难精。许多人说学习 C语言只需一本K&RC程序设计语言即可,但C+书籍却是多不 Y11t9 0胜数。我是从 C进入C+,皆是靠阅读自学。在此分享一点学习心得。个人认为,学习 C+可分为4个层次:第一层次,C+基础:挑选一本入门书籍,如C+ Primer、C+大学教程、或Stroustrup 撰写的经典C+程序设计语言或他一年半前的新作C+程序设计原理与实践,而一般C+ 课程也止于此,另外C+ 标准程序库及The C+ StandardLibrary Extensions 可供参考;bFYmc第二层次,正确高效地使用C+:此层次开始必须自修,阅读过 (More)EffectiveC+、 (More)Exceptiona1 C+、 Effective STL 及C+ 编程规范等,才适宜踏入专业C+ 开发之路;8Gk8d。第三层次,深入了解 C+:关于全局问题
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 计算机基础知识点更新的试题及答案
- 西北大学《诊断学(一)》2023-2024学年第二学期期末试卷
- 2024-2025学年贵州省黔东南州凯里六中学初三全真四模英语试题试卷含答案
- 福建省福州市第一中学2024-2025学年高中毕业班第三次诊断性测试语文试题试卷含解析
- 湖北师范大学文理学院《数字影像合成》2023-2024学年第二学期期末试卷
- 2025【店铺转让合同范本】商业转让合同模板
- 宠物营养对免疫系统的影响及试题答案
- 张家口市阳原县文职辅警招聘考试真题
- 学校食堂等集中用餐单位落实“日管控 周排查月调度”风险防控机制指引(试行)
- 2025年全国爱卫生日健康教育宣传主题班会课件
- 中式烹调师初级试卷
- 高考倒计时60天课件
- 幼儿园绘本故事:《十二生肖》 课件
- (完整版)人教版小学3-6年级英语单词表-可直接打印
- 机电安装总进度计划横道图
- 起重吊装作业安全综合验收记录表
- 园林绿化工程监理实施细则(完整版)
- 梦想(英语演讲稿)PPT幻灯片课件(PPT 12页)
- 中国联通员工绩效管理实施计划方案
- 法院刑事审判庭速裁庭廉政风险防控责任清单
- IEC60335-1(中文)
评论
0/150
提交评论