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

C++强大的背后(一)

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

在31年前(1979年),一名刚获得博士学位的研究员,为了开发一个软件项目发明了一门新编程语言,该研究员名为Bjarne Stroustrup,该门语言则命名为——C with classes,四年后改称为C++。C++是一门通用编程语言,支持多种编程范式,包括过程式、面向对象(object-oriented programming, OP)、泛型(generic programming, GP),后来为泛型而设计的模版,被发现及证明是图灵完备的,因此使C++亦可支持模版元编程范式(template metaprogramming, TMP)。C++继承了C的特色,既为高级语言,又含低级语言功能,可同时作为系统和应用编程语言。

C++广泛应用在不同领域,使用者以数百万计。根据近十年的调查,C++的流行程度约稳定排行第3位(于C/Java之后)。 C++经历长期的实践和演化,才成为今日的样貌。1998年,C++标准委员会排除万难,使C++成为ISO标准(俗称C++98),当中含非常强大的标准模版库(standard template library, STL)。之后委员会在2005年提交了有关标准库的第一个技术报告(简称TR1),并为下一个标准C++0x而努力。可惜C++0x并不能在200x年完成,各界希望新标准能于2011年内出台。

流行的C++编译器中,微软Visual C++ 2010已实现部分C++0x语法并加入TR1扩充库,而gcc对C++0x语法和库的支持比VC2010更多。

应否选择C++

哪些程序适宜使用C++?

C++并非万能丹,我按经验举出一些C++的适用时机。

C++适合构造程序中需求较稳定的部分,需求变化较大的部分可使用脚本语言;

程序须尽量发挥硬件的最高性能,且性能瓶颈在于CPU和内存;

程序须频繁地与操作系统或硬件沟通;

程序必须使用C++框架/库,如大部分游戏引擎(如Unreal/Source)及中间件(如Havok/FMOD),虽然有些C++库提供其他语言的绑定,但通常原生的API性能最好、最新;

项目中某个目标平台只提供C++编译器的支持。

按应用领域来说,C++适用于开发服务器软件、桌面应用、游戏、实时系统、高性能计算、嵌入式系统等。

使用C++还是C?

C++和C的设计哲学并不一样,两者取舍不同,所以不同的程序员和软件项目会有不同选择,难以一概而论。与C++相比,C具备编译速度快、容易学习、显式描述程序细节、较少更新标准(后两者也可同时视为缺点)等优点。在语言层面上,C++包含绝大部分C语言的功能(例外之一,C++没有C99的变长数组VLA),且提供OOP和GP的特性。但其实用C也可实现OOP思想,亦可利用宏去实现某程度的GP,只不过C++的语法能较简洁、自动地实现OOP/GP。C++的RAII(resource acquisition is initialization,资源获取就是初始化)特性比较独特,C/C#/Java没有相应功能。回顾历史,Stroustrup开发的早期C++编译器Cpre/Cfront是把C++源代码翻译为C,再用C编译器编译的。由此可知,C++编写的程序,都能用等效的C程序代替,但C++在语言层面上提供了OOP/GP语法、更严格的类型检查系统、大量额外的语言特性(如异常、RTTI等),并且C++标准库也较丰富。有时候C++的语法可使程序更简洁,如运算符重载、隐式转换。但另一方面,C语言的API通常比C++简洁,能较容易供其他语言程序调用。因此,一些C++库会提供C的API封装,同时也可供C程序调用。相反,有时候也会把C的API封装成C++形式,以支持RAII和其他C++库整合等。

为何C++性能可优于其他语言?

相对运行于虚拟机语言(如C#/Java),C/C++直接以静态形式把源程序编译为目标平台的机器码。一般而言,C/C++程序在编译及链接时可进行的优化最丰富,启动时的速度最快,运行时的额外内存开销最少。而C/C++相对动态语言(如Python/Lua)也减少了运行时的动态类型检测。此外,C/C++的运行行为是确定的,且不会有额外行为(例如C#/Java必然会初始化变量),也不会有如垃圾收集(GC)而造成的不确定性延迟,而且C/C++的数据结构在内存中的布局也是确定的。有时C++的一些功能会使程序性能优于C,当中以内联和模版最为突出,这两项功能使C++标准库的sort()通常比C标准库的qsort()快多倍(C可用宏或人手编码去解决此问题)。另一方面,C/C++能直接映射机器码,之间没有另一层中间语言,因此可以做底层优化,例如使用内部(intrinsic)函数和嵌入汇编语言。然而,许多C++的性能优点并非免费午餐,代价包括较长的编译链接时间和较易出错,因而增加开发时间和成本,这点稍后补充。

我进行了一个简单全局渲染性能测试(512x512像素,每像素10000个采样),C++ 1小时36分、Java 3小时18分、Python约18天、Ruby约351天。评测方式和其他语言的结果详见博文。

C++常见问题

C++源代码跨平台吗?

C++有不错的跨平台能力,但由于直接映射硬件,因性能优化的关系,跨平台能力不及Java及多数脚本语言。然而,实践跨平台的C++软件还是可行的,但须注意以下问题:

C++标准没有规定原始数据类型(如int)的大小,需要特定大小的类型时,可自订类型(如int32_t),同时对任何类型使用sizeof()而不假设其大小;

字节序(byte order)按CPU有所不同,特别要注意二进制输入输出、reinterpret_cast法;

原始数据和结构类型的地址对齐有差异;

编译器提供的一些编译器或平台专用扩充指令;

避免作应用二进制接口(application binary interface, ABI)的假设,例如调用函数时参数的取值顺序在C/C++中没定义,在C++中也不可随便假设RTTI/虚表等实现方式。

总括而言,跨平台C++软件可在头文件中用宏检测编译器和平台,再用宏、typedef、自定平台相关实现等方法去实践跨平台,C++标准不会提供这类帮助。

C++程序容易崩溃?

和许多语言相比,C/C++提供不安全的功能以最优化性能,有可能造成崩溃。但要注意,很多运行时错误,如向空指针/引用解引用、数组越界、堆栈溢出等,其他语言也会报错或抛出异常,这些都是程序问题,而不是语言本身的问题。有些意见认为,出现这类运行时错误,应该尽量写入日志并立即崩溃,不该让程序继续运行,以免造成更大的影响(例如程序继续把内存中错误的数据覆写文件)。若要容错,可按业务把程序分割为多进程,像Chrome或使用fork()的形式。然而,C++有许多机制可以减少错误,例如以string代替C字符串;以vector或array(TR1)代替原始数组(有些实现可在调试模式检测越界);使用智能指针也能减少一些原始指针的问题。另外,我最常遇到的Bug,就是没有初始化成员变量,有时会导致崩溃,而且调试版和发行版的行为可能不同。

C++要手动做内存管理?

C++同时提供在堆栈上的自动局部变量,以及从自由存储(free store)分配的对象。对于后者,程序员需手动释放,或使用不同的容器和智能指针。 C++程序员经常进一步优化内存,自定义内存分配策略以提升效能,例如使用对象池、自定义的单向/双向堆栈区等。虽然C++0x还没加入GC功能,但也可以自行编写或使用现成库。此外,C/C++也可以直接使用操作系统提供的内存相关功能,例如内存映射文件、共享内存等。

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

分享到:
评论

相关推荐

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

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

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

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

    The Annotated C++ Reference Manual

    μC++旨在提供一套强大的、易于使用的实时编程机制,它在C++的基础上添加了一系列针对并发和实时系统的新特性,如线程、同步原语等,同时保持与标准C++的兼容性。 #### 1.2 元素执行属性 这部分详细解释了μC++中...

    c++ 运行js脚本

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

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

    C++是一种强大的编程语言,广泛应用于系统编程、高性能计算、嵌入式系统和数值科学等领域。C++的复杂性和灵活性吸引了无数程序员,由此诞生了许多经典的著作。这些书籍不仅提供了深入的语言理解和实践指导,而且反映...

    Essential C++中文版pdf

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

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

    C++是一种多范式、静态类型、编译型、并发型、通用程序设计语言,它以其强大的功能和灵活性而闻名。这本书的目标是帮助读者理解C++对象模型背后的细节,包括内存管理、类型系统、对象生命周期、继承、多态等核心概念...

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

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

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

    - **第六章:标准库与STL**:介绍了C++标准库中的各种组件,特别是标准模板库(STL),它是C++中最强大且实用的工具集之一。 - **第七章:C++的未来方向**:展望了C++语言未来的发展趋势,包括新的特性和改进方向。 #...

    The Design and Evolution of C++(高清文字非影印版本)

    C++的发展深受其前身C语言的影响,但又增加了类、模板、异常处理、命名空间等高级特性,使得它成为一个更为强大且功能丰富的语言。 在《C++的设计与演化》一书中,Stroustrup探讨了以下几个关键知识点: 1. **C++...

    C++设计与演化

    《C++设计与演化》是Bjarne Stroustrup所著的一本经典著作,它深入探讨了C++语言的设计哲学、发展历程以及其背后的决策过程。这本书对于理解C++的核心特性,以及如何有效地利用这些特性来编写高效、可维护的代码至关...

    C++标准,英文版的C++语言国际标准

    深入学习C++国际标准需要理解其背后的原理和设计哲学,同时结合实践编写代码,通过阅读标准文档,可以更准确地理解和掌握语言的细节,避免因误解而引入的错误。对于有一定基础的C++学习者来说,研读英文版的C++标准...

    C++高级教程C++高级教程PDF

    一-C++的难学,不仅在于其广博的语法、语法背后的语义、语义背后的深层思维、深层思维背后的对象模型:C++的难学,还在于它提供了四种不同但却相辅相成的编程思维模型: ……。在如此庞大复杂的机制下,万千使用者...

    C++初级到精髓3本书

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

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

    "27个经典趣味C++程序实例"是一份宝贵的资源,旨在帮助已经掌握一定C++基础知识的学习者进一步提升编程技巧和理解。这些实例涵盖了各种有趣的主题,旨在通过实际操作来增强你的编程思维和问题解决能力。 首先,C++...

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

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

    C++的沉迷和爱恋——非常有意思的一本书,花枯燥为乐趣

    通过这本书,读者可以学会如何以一种全新的视角来看待问题,如何运用C++的强大功能来解决问题。无论是对于初学者还是有经验的开发者,这本书都是一个宝贵的学习资源,能够帮助他们在C++的海洋中航行得更远,更深。...

    C++版本,C++工资管理系统

    本篇文章将深入探讨一个用C++编写的工资管理系统,揭示其背后的原理与实现细节。 一、系统架构与设计原则 1. **模块化设计**:一个完善的工资管理系统通常包含员工信息管理、工资计算、税务处理、报表生成等多个...

    C++语言的设计和演化

    2. **模板编程**:模板是C++中的一个强大特性,用于实现泛型编程。通过模板,可以编写可重用且类型安全的代码。 3. **标准模板库(STL)**:STL提供了大量经过优化的数据结构和算法,极大地提高了开发效率。 4. **异常...

    C++项目源代码(适合新手练手及参考)

    C++是一种强大的、面向对象的编程语言,广泛应用于系统软件、游戏开发、应用软件等多个领域。对于初学者来说,掌握C++不仅能够提升编程技能,还能深入理解计算机工作原理。本项目源代码集合正是针对C++新手设计的,...

Global site tag (gtag.js) - Google Analytics