`
chenyunhong
  • 浏览: 140415 次
  • 性别: Icon_minigender_1
  • 来自: 真的不知道
社区版块
存档分类
最新评论

C++强大的背后(二)

    博客分类:
  • C++
 
阅读更多

使用C++常要重造轮子?

我曾参与的C++项目,都会重造不少标准库已提供的功能,此情况在其他语言中较少出现。我试图分析个中原因。首先,C++标准库相对很多语言来说是贫乏的,各开发者便会重复地制造自订库。从另一个角度看,C++标准库是用C++编写的(很多其他语言不用自身而是用C/C++去编写库),在能力和性能上,自订库和标准库并无本质差别;另外,标准库为通用而设,对不同平台及多种使用需求作取舍,性能上有所影响,例如EA公司就曾发表自制的EASTL规格,描述游戏开发方面对STL的性能及功能需求的特点;此外,多个C++库一起使用,经常会因规范不同而引起冲突,又或功能重叠,所以项目可能须自行开发,或引入其他库的概念或实现(如Boost/TR1/Loki),改写以符合项目规范。

C++编译速度很慢?

错,是非常慢。我认为C++可能是实用程序语言中编译速度最慢的。此问题涉及C++沿用C的编译链接方式,又加入了复杂的类/泛型声明和内联机制,使编译时间倍增。在C++对编译方法改革之前(如module提案),可使用以下技巧改善:第一,使用pimpl手法,因性能损耗应用于调用次数不多的类;第二,仅包含必要头文件,并尽量使用及提供前置声明版本的头文件(如iosfwd);第三采用基于接口的设计,但须注意虚函数调用成本;第四,采用unity build,即把多个cpp文件结合在一个编译单元进行编译;第五,采用分布式生成系统如IncrediBuild。

C++缺乏什么功能?

虽然C++已经非常复杂,但仍缺少很多常见功能。 C++0x作出了不少改善,例如语言方面加入Lambda函数、闭包、类型推导声明等,而库方面则加入正则表达式、采用哈希表的unordered_set/unordered_map、引用计数智能指针shared_ptr/weak_ptr等。但最值得留意的是C++0x引入多线程的语法和库功能,这是C++演进的一大步。然而,模组、GC、反射机制等功能虽有提案,却未加进C++0x。

C++使用建议

为应用挑选特性集

我同意Stroustrup关于使用C++各种技术的回应:“你可以做,不意味着你必须这么做。(Just because you can do it, doesn‘t mean that you have to.)” C++充满丰富的特性,但同时带来不同问题,例如过分复杂、编译及运行性能的损耗。一般可考虑是否使用多重继承、异常、RTTI,并调节使用模版及模版元编程的程度。使用过分复杂的设计和功能,可能会令部分团队成员更难理解和维护。

为团队建立编程规范

C++的编码自由度很高,容易编写风格迥异的代码,C++本身也没有定义一些标准规范。而且,C++的源文件物理构成,较许多语言复杂。因此,除了决定特性集,每个团队应建立一套编程规范,包括源文件格式(可使用文件模版)、花括号风格。

尽量使用C++风格而非C风格

由于C++有对C兼容的包袱,一些功能可以使用C风格实现,但最好使用C++提供的新功能。最基本的是尽量以具名常量、内联函数和泛型取代宏,只把宏用在条件式编译及特殊情况。旧式的C要求局部变量声明在作用域开端,C++则无此限制,应把变量声明尽量置于邻近其使用的地方,for()的循环变量声明可置于for的括号内。 C++中能加强类型安全的功能应尽量使用,例如避免“万能”指针void *,而使用个别或泛型类型;用bool而非int表示布尔值;选用4种C++ cast关键字代替简单的强制转换。

结合其他语言

如前文所述,C++并非适合所有应用情境,有时可以混合其他语言使用,包括用C++扩展其他语言,或在C++程序中嵌入脚本语言引擎。对于后者,除了使用各种脚本语言的专门API,还可使用Boost或SWIG作整合。

C++学习建议

C++缺点之一,是相对许多语言复杂,而且难学难精。许多人说学习C语言只需一本K&R《C程序设计语言》即可,但C++书籍却是多不胜数。我是从C进入C++,皆是靠阅读自学。在此分享一点学习心得。个人认为,学习C++可分为4个层次:

第一层次,C++基础:挑选一本入门书籍,如《C++ Primer》、《C++大学教程》、或Stroustrup撰写的经典《C++程序设计语言》或他一年半前的新作《C++程序设计原理与实践》,而一般C++课程也止于此,另外《C++ 标准程序库》及《The C++ Standard Library Extensions》可供参考;

第二层次,正确高效地使用C++:此层次开始必须自修,阅读过《(More)Effective C++》、《(More)Exceptional C++》、《Effective STL》及《C++编程规范》等,才适宜踏入专业C++开发之路;

第三层次,深入了解C++:关于全局问题可读《深入探索C++对象模型》、《Imperfect C++》、《C++沉思录》、《STL源码剖析》,要挑战智商,可看关于模版及模版元编程的书籍如《C++ Templates》、《C++设计新思维》、《C++模版元编程》;

第四层次,研究C++:阅读《C++语言的设计和演化》、《编程的本质》(含STL设计背后的数学根基)、C++标准文件《ISO/IEC 14882:2003》、C++标准委员会的提案书和报告书、关于C++的学术文献。

由于我主要是应用C++,大约只停留于第二、三个层次。然而,C++只是软件开发的一环而已,单凭语言并不能应付业务和工程上的问题。建议读者不要强求几年内“彻底学会C++的知识”,到达第二层左右便从工作实战中汲取经验,有兴趣才慢慢继续学习更高层次的知识。虽然学习C++有难度,但也是相当有趣且有满足感的。

数十年来,C++虽有起伏,但她依靠其使用者而不断得到顽强的生命力,相信在我退休之前都不会与她分离,也希望更进一步了解她,与她走进未来。

本文转自博客园    原文:C++强大背后

分享到:
评论

相关推荐

    c++编程思想(think in c++)(第二版)

    《C++编程思想》第二版通过丰富的示例和深入的解释,帮助读者不仅学习到C++语言的语法,更能理解其背后的编程理念,培养出优秀的编程思维。无论你是初学者还是经验丰富的开发者,这本书都能为你提供宝贵的指导。

    Thinking in C++ 卷一卷二、原版英文、官方chm版

    通过阅读《Thinking in C++》,读者不仅可以学习到C++的基础语法,还能理解其背后的编程理念,提升编写高效、可维护的代码的能力。书中的例子丰富且实用,适合初学者和有一定经验的开发者作为参考。

    Thinking in C++(第二版)

    《Thinking in C++》是C++编程领域的一本经典著作,由Bruce Eckel撰写,第二版更是对该领域的学习者提供了全面而深入的指导。这本书旨在帮助读者不仅掌握C++语言的基本语法,更深入理解C++的设计哲学和面向对象编程...

    C++谭浩强教材习题答案

    《C++谭浩强教材习题答案》是一个针对C++初学者的重要资源,它包含了谭浩强教授编著的C++教材中的书本习题和上机实践题目...同时,记得理论与实践相结合,理解代码背后的逻辑,这样才能真正掌握C++这一强大的编程工具。

    c++四书五经~介绍c++所有经典名著!

    D&E则深入探讨了C++的设计决策和演变过程,帮助读者理解语言背后的思考和选择。 除了TCPL和D&E,另一本值得一提的入门教程是Andrew Koenig和Barbara E. Moo合著的《Accelerated C++》。这本书采用了一种非传统的...

    The Annotated C++ Reference Manual

    这部分阐述了μC++设计背后的基本原则和目标。μC++旨在提供一套强大的、易于使用的实时编程机制,它在C++的基础上添加了一系列针对并发和实时系统的新特性,如线程、同步原语等,同时保持与标准C++的兼容性。 ####...

    c++ 运行js脚本

    在IT领域,C++是一种强大的、高效的编程语言,而JavaScript则是一种广泛用于Web开发的脚本语言。有时候,我们可能需要在C++程序中运行JavaScript代码,以实现某些功能或者利用JavaScript的灵活性。这种需求主要出现...

    C++的设计与演化——电子书

    - **第二章:设计目标与原则**:深入探讨了C++的设计目标及其背后的哲学思考,比如兼容性、灵活性、效率与安全性之间的平衡。 - **第三章:核心语言特性**:对C++的核心语法进行详细解析,包括类型系统、表达式、...

    深度探索c++对象模型(2012版本)

    这本书的目标是帮助读者理解C++对象模型背后的细节,包括内存管理、类型系统、对象生命周期、继承、多态等核心概念。 C++对象模型是C++编程的基础,它描述了如何在内存中表示类和对象,以及它们之间的关系。首先,...

    一个免费的c++小游戏集合

    C++是一种强大的、通用的面向对象编程语言,以其高效性和灵活性闻名,广泛应用于游戏开发、系统软件、嵌入式系统以及各种复杂应用的后端开发。 首先,让我们来探讨C++在游戏开发中的应用。C++的性能优势使得它成为...

    27个经典趣味C++程序实例

    5. **数组与指针**:C++中的数组和指针是强大的工具,它们可以用于高效地处理大量数据。实例可能会涉及到动态内存分配和释放。 6. **异常处理**:学习如何使用try-catch块来处理程序运行时可能出现的错误,以确保...

    C/C++狼人杀框架代码

    它的强大之处在于提供底层内存控制和高效性能,这使得C++成为开发游戏框架的理想选择。 在构建狼人杀框架时,我们需要考虑以下几个关键点: 1. **数据结构与类的设计**:狼人杀中的每个角色(如村民、狼人、预言家...

    Essential C++中文版pdf

    通过阅读并实践书中的例子,读者不仅可以掌握C++的基本语法,还能理解其背后的编程思想,从而成为一名合格的C++开发者。无论你是刚刚接触C++,还是希望巩固和深化对C++的理解,这本书都是不可或缺的参考资料。

    C++经典书籍之一(Think in C++,effectiveC++ )

    《Think in C++》提供了扎实的理论基础,《Effective C++》则指导如何在实践中发挥C++的强大功能。结合阅读这两本书,读者可以从初级到高级,全面提升自己的C++编程技能。 在阅读过程中,应结合书中的示例代码进行...

    C++初级到精髓3本书

    C++是一种强大的、通用的编程语言,以其面向对象特性、高效性能和丰富的库支持而闻名。这三本书——"Effective C++中文版第三版"、"More Effective C++"和"深度探索C++对象模型"是C++学习者进阶过程中不可或缺的资源...

    C++编程思想第二卷

    通过阅读《C++编程思想第二卷》,读者不仅可以掌握C++的基本语法,还能理解其背后的编程思想,学会如何利用C++的强大特性来构建高效、可扩展的系统。书中的实例和练习有助于读者将理论知识转化为实践技能,从而成为...

    the c++ programming language (3rd edition) pdf

    《C++ Programming Language》(第三版)是Bjarne Stroustrup所著的一本经典书籍,被誉为C++...阅读这本书,不仅可以学习到C++语言本身,还能理解其背后的思维方式和编程哲学,这对于成为一个优秀的C++开发者至关重要。

    Visual C++数字图像处理(第二版)光盘

    在Visual C++环境中,我们可以利用其强大的MFC(Microsoft Foundation Classes)库和OpenCV(开源计算机视觉库)等工具来实现复杂的图像处理任务。本书的第二版可能对原有的内容进行了更新和优化,以适应不断发展的...

    如何学好C++语言

    这意味着不仅要学习C++的语法和特性,还要深入了解每项特性背后的设计理念。例如: 1. **拷贝构造函数**:理解为何需要拷贝构造函数以及它在对象复制过程中的作用。 2. **初始化列表**:探讨初始化列表相对于普通...

Global site tag (gtag.js) - Google Analytics