官方服务微信:dat818 购买与出租对接

C++:通用编程语言,支持多种范式且广泛应用排行稳定

3万

主题

2

回帖

10万

积分

管理员

积分
103738
发表于 昨天 14:46 | 显示全部楼层 |阅读模式
    C++作为一种广泛应用的编程工具,涵盖了多种编程风格,诸如过程式编程、面向对象编程以及泛型编程。特别是专为泛型编程设计的模板,其图灵完备性得到了证实,这使得C++能够支持模板元编程这一独特的编程范式。C++继承了C语言的特点,它既具备高级语言的特性,又保留了低级语言的功能,因此它既适用于系统级编程,也适用于应用级编程。

    C++在众多领域得到了广泛的应用,其用户数量已达到数百万之众。根据最近十年的调查数据,C++的受欢迎程度大致保持在第三位,仅次于C和Java。这一编程语言经过长期的实践与演变,才形成了现在的形态。1998年,面对重重困难,C++标准委员会成功地将C++确立为ISO标准,即C++98,其中包含了功能强大的标准模板库,也就是人们常说的STL。随后,委员会于2005年推出了首个关于标准库的技术报告,该报告被简称为TR1,并致力于推动下一个标准C++0x的进展。遗憾的是,C++0x未能按计划在200x年完成。社会各界普遍期待,新的标准能够在2011年之前正式发布。在众多流行的C++编译器中,微软的C++ 2010版本已经对C++0x的部分语法进行了实现,并且引入了TR1扩充库。与此同时,gcc编译器对C++0x语法和库的支持更为全面,而苹果的clang编译器在支持度方面也相当不错。

    若想深入了解C/C++编程的奥秘,欢迎您加入我们的学习交流群,在此您可以与众多同好者共同探讨、共同进步。

    目前C++已历经C++11、C++14的迭代升级至C++17,其语法功能将持续进步,同时,各大厂商的编译器也将持续提升对最新语法的支持力度。

    在选择C++作为编程语言时,需要考虑哪些项目适合用它?C++并非适用于所有场景,根据我的实践经验,以下是一些使用C++的合适场景。C++适用于构建程序中那些需求相对稳定的模块,而对于那些需求变动较大的部分,则推荐使用脚本语言。在编写程序时,应尽量挖掘硬件的最大潜能,其中CPU和内存往往是性能的瓶颈。此外,程序需要频繁地与操作系统或硬件进行交互。通常情况下,程序需要借助C++框架或库,例如许多游戏引擎(例如某些知名游戏引擎)以及中间件(如Havok和FMOD)。尽管一些C++库也支持其他语言的接口,但原生API的性能和更新度通常更为优越。此外,项目中的某个特定目标平台可能仅支持C++编译器。从应用范围的角度来看,C++被广泛用于构建服务器端软件、桌面应用程序、游戏开发、实时控制系统、高性能计算任务以及嵌入式系统等领域。

    想要学习更多C/C++编程知识,可以加入C/C++学习交流群:和大家一起交流学习。

    使用C++还是C?

    C++与C在设计理念上存在差异,二者在取舍上有所区别,因此,不同的程序员和软件项目会根据自身需求做出不同的选择,这种情况下很难给出一个统一的结论。相较于C++,C语言具有编译效率高、学习门槛低、程序细节描述明确、更新标准频率较低等优势(后两点亦可以看作是其不足之处)。在语言特性方面,C++涵盖了C语言的绝大多数功能,但C99中的变长数组VLA是C++所不具备的。尽管如此,通过C语言同样可以实践面向对象编程(OOP)的理念,以及通过宏定义实现一定程度的泛型编程(GP)。然而,C++的语法结构使得OOP和GP的实现更为简洁和自动化。C++中的RAII(资源获取即初始化)机制独具特色,这一点在C/C#和Java中是找不到的。回顾编程历史,早期的C++编译器,如Cpre,是将C++的源代码转换成C语言代码,然后使用C语言的编译器进行编译。C++编写的程序,实际上可以用相应的C程序来替代。然而,C++在语言层面引入了面向对象/泛型编程的语法、更为严格的类型验证机制以及众多额外的语言特性,例如异常处理和运行时类型识别。此外,C++的标准库也相对更为丰富。在某些情况下,C++的语法甚至能够让程序变得更加简洁,例如通过运算符重载和隐式类型转换等功能。然而,C语言的接口设计往往更为简明,这使得它更便于其他编程语言的应用程序所引用。鉴于此,部分C++库会提供对C接口的封装,以便C程序也能使用。而另一方面,有时C接口会被重新封装为C++风格,以便实现资源获取即初始化(RAII)模式以及与其他C++库的集成。

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

    C/C++程序与运行在虚拟机上的语言(例如C#或Java)不同,它们直接将源代码编译成目标平台的机器指令。通常来说,C/C++在编译和链接阶段能够实现更为丰富的优化,启动速度更快,且在运行过程中产生的额外内存消耗更小。此外,与动态语言(如Lua)相比,C/C++还减少了运行时的动态类型检查。此外,C/C++的执行过程具有确定性,不会产生额外的操作(如C#或Java必须初始化变量那样),也不会因垃圾回收(GC)等机制而引发的不确定性延迟,并且C/C++的数据结构在内存中的排列也是固定不变的。C++的某些特性能够提升程序执行效率,其中内联函数和模板技术尤为显著,它们使得C++的sort()函数通常比C的qsort()函数运行速度快出数倍(C语言可以通过宏定义或手动编写代码来克服这一问题)。此外,C/C++能够直接与机器码对接,无需经过额外的中间语言转换,这使得进行底层优化成为可能,比如运用内部函数以及嵌入汇编指令。然而,C++在性能上虽有许多优势,但这些并非无代价可得,具体表现为编译和链接过程耗时较长,且更容易出现错误,这无疑会延长开发周期并提升成本,这一点将在稍后进行详细说明。

    想要学习更多C/C++编程知识,可以加入C/C++学习交流群:和大家一起交流学习。

    C++常见问题C++源代码跨平台吗?

    C++具备较强的平台适应性,然而,由于它直接与硬件进行对接,并且为了性能的优化,其跨平台性能相较于Java以及大多数脚本语言略显不足。尽管如此,开发能够实现跨平台的C++软件仍然是可能的,但在这一过程中,我们需要关注以下几个问题:

    C++规范并未对基本数据类型(例如int)的尺寸做出明确要求。若需指定特定尺寸的类型,用户可自行定义。此外,对于所有类型,都应使用特定函数而非预设其尺寸;字节序因CPU而异,尤其在处理二进制输入输出时需特别注意;原始数据与结构体类型的内存地址对齐方式存在差异;编译器还提供了一些针对特定编译器或平台的扩展指令;同时,应避免对应用二进制接口(ABI)做出假设,比如在C/C++中,函数调用时参数的传递顺序并未规定,而在C++中,关于RTTI/虚表等实现方式也不应随意假设。

    总体来说,跨平台的C++软件通过在头文件中运用宏指令来识别编译器和操作系统,并借助宏定义、自定义平台相关实现等手段来实现跨平台功能,然而,C++的标准库本身并不提供此类支持。

    C++程序容易崩溃?

    与众多编程语言相较,C/C++在追求性能优化的同时,确实引入了一些不安全的功能,这可能导致程序崩溃。然而,需留意的是,诸如对空指针或引用的误用、数组越界、堆栈溢出等运行时错误,在其他编程语言中同样会引发错误报告或异常抛出。这些问题本质上是程序设计上的缺陷,而非语言本身的缺陷。一些观点主张,一旦发生此类运行中的错误,应尽可能记录在日志中并迅速终止程序运行,不应让程序继续执行,以防产生更严重的后果(如错误数据覆盖文件中的数据)。若要实现容错,可以将程序按照业务逻辑划分为多个进程,或者采用fork()等机制。C++具备多种机制来降低出错概率,比如使用宽字符来替代C风格的字符串;通过std::array或TR1::array来替换传统数组(部分实现能在调试模式下检测越界);同时,智能指针的使用也有助于减少原始指针可能引发的问题。此外,我经常遇到的一个Bug是成员变量未初始化,这有时会导致程序崩溃,而且调试版本和发布版本在行为上可能存在差异。

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

    C++支持在栈上自动创建局部变量,同时也允许从自由存储区域分配对象。对于这类对象,程序员需要手动进行释放操作,或者借助特定的容器和智能指针来实现。在C++编程中,开发者常常会寻求内存优化的途径,他们可能会自定义内存分配策略,以此来提高程序的性能,比如采用对象池、定制化的单向或双向堆栈区域等方法。尽管C++0x尚未集成垃圾回收机制,开发者仍能自行编写相关代码或借助线程库实现。同时,C/C++语言能够直接调用操作系统所提供的内存管理功能,比如内存映射文件和共享内存等。

    想要学习更多C/C++编程知识,可以加入C/C++学习交流群:和大家一起交流学习。

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

    在我参与的C++项目中,常常需要重新构建标准库所提供的诸多功能,这种现象在其它编程语言中并不常见。我尝试对这一现象进行深入分析。首先,相较于许多其它编程语言,C++的标准库显得较为简陋,因此,众多开发者不得不自行创建专属的库。从另一个视角来看,C++的库是采用C++语言编写的(相较于其他语言,许多并不采用自身语言编写库,而是选用C/C++),在功能与性能方面,自定义库与标准库并无根本区别;此外,标准库旨在满足通用需求,针对不同平台和多样化的使用场景进行优化,这可能会对性能产生一定影响,比如EA公司就曾推出自己的EASTL规范,专门针对游戏开发中对STL性能和功能的具体需求进行描述;再者,当多个C++库同时使用时,常常会因为规范不一致而导致冲突,或者出现功能上的重复,因此,项目可能需要自行开发,或者采纳其他库的理念或实现(例如Boost/TR1/Loki),以确保与项目规范相契合。

    C++编译速度很慢?

    错误,速度极为缓慢。在我看来,C++在所有实用程序语言中,其编译速度可能是最慢的一种。这一现象与C++继承了C的编译和链接方法有关,同时它还引入了复杂的类/泛型声明以及内联功能,这两者共同作用,使得编译所需的时间大大增加。在C++编译方法改革(如相关提案)实施之前,我们可以采取以下策略进行优化:首先,运用Pimpl技术,这一手法适用于那些调用频率较低的类,以减少性能损耗;其次,只包含必需的头文件,并尽可能使用和提供前置声明的头文件版本(例如);再者,实施基于接口的设计,但同时需留意虚函数调用的开销;此外,实施Unity Build,即将多个cpp文件合并为一个编译单元进行编译;最后,使用分布式生成系统,如。

    C++缺乏什么功能?

    尽管C++本身就已经相当复杂,但它仍存在不少常见功能的缺失。C++0x版本在诸多方面进行了改进,比如在语言层面引入了函数对象、闭包以及类型推导声明等功能,同时在库的层面,增加了正则表达式支持以及基于哈希表的实现。

    引用计数智能指针等特性,然而,C++0x版本的显著进步在于其多线程语法和库功能的引入,这标志着C++语言发展的重要里程碑。尽管如此,尽管有关于模组、垃圾回收和反射等机制的提议,这些功能并未被纳入C++0x标准之中。

    想要学习更多C/C++编程知识,可以加入C/C++学习交流群:和大家一起交流学习。

    C++使用建议为应用挑选特性集

    我赞同对于C++技术应用的反馈:“你有能力去实施,但这并不意味着你一定要这么做。”C++拥有众多特性,然而,它也伴随而来各种问题,比如结构过于复杂,以及编译和运行时的性能损耗。在项目开发过程中,需权衡是否采纳多重继承、异常处理以及运行时类型识别等技术,同时也要适度运用模板和模板元编程。若过度追求复杂的设计和功能,可能会造成部分团队成员对代码的理解和后续维护带来困难。

    想要学习更多C/C++编程知识,可以加入C/C++学习交流群:和大家一起交流学习。

    为团队建立编程规范

    C++的编程灵活性较强,使得开发者能够轻松地创作出风格多样的代码。然而,C++自身并未设定特定的编程标准。此外,C++的源代码文件在物理结构上相对其他编程语言更为复杂。鉴于此,各团队在确定特性集的同时,还需制定一套完整的编程规范,这其中包括源文件的格式规范(如采用文件模板)以及花括号的使用风格。

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

    C++虽然继承了C的兼容性,导致某些功能可以沿用C的风格来完成,然而,我们更推荐采用C++自身提供的先进特性。最关键的是,应尽可能使用具名常量、内联函数以及泛型来替代宏,除非在条件式编译或处理特定情况时,才应保留宏的使用。传统的C语言规定局部变量必须在作用域起始处进行声明,而C++语言则没有这样的规定。在C++中,建议将变量的声明尽量靠近它们被使用的地方,例如,在for循环的括号内声明循环变量。在C++编程中,我们应优先采用强化类型安全的功能,比如应当舍弃“万能”指针void*,转而使用特定或泛型类型;用bool类型来表示布尔值,而不是int;并且,在转换时,应选择四种C++的cast关键字,而非简单的强制类型转换。

    结合其他语言

    如前文所述,C++并非适用于所有应用场景。在某些情况下,它可以与其他语言结合使用。例如,可以用C++来扩展其他语言的功能,或者将脚本语言引擎嵌入到C++程序中。对于后者,除了利用各种脚本语言的专用API之外,还可以借助Boost或SWIG进行整合。

    C++学习建议

    C++的不足之处之一在于其相对于其他语言来说较为复杂,同时学习难度大,精通更不易。虽然有人认为掌握C语言只需一本《C程序设计语言》这本书,然而关于C++的书籍却琳琅满目。我个人的学习经历是从C语言过渡到C++,完全依靠自学和阅读。在此,我想分享一些学习体会。在我看来,学习C++的过程可以划分为四个不同的阶段:

    在第一阶段,选择一本入门教材,比如《C++ 》、《C++大学教程》,或是经典之作《C++程序设计语言》或者他近期的作品《C++程序设计原理与实践》,通常C++的学习就到这里结束,此外,《C++标准程序库》和《The C++  》也是很好的参考资料;进入第二阶段,为了正确高效地运用C++,必须自学,阅读过《More  C++》、《 STL》和《C++编程规范》等书籍后,才适合踏上专业C++开发的旅程;第三阶段,深入理解C++,对于全局性问题,可以阅读《深入探索C++对象模型》、《 C++》和《C++沉思录》、《STL源码剖析》,若想挑战智力,可以研究模版和模版元编程相关的书籍,如《C++模板》、《C++设计新思维》和《C++模版元编程》;在第四阶段,研究C++,需阅读《C++语言的设计和演化》、《编程的本质》(包括STL设计背后的数学原理)、《ISO/IEC 14882:2003》C++标准文件、C++标准委员会的提案书和报告书,以及C++的学术文献。

    想要学习更多C/C++编程知识,可以加入C/C++学习交流群:和大家一起交流学习。
您需要登录后才可以回帖 登录 | 立即注册

Archiver|手机版|小黑屋|关于我们

Copyright © 2001-2025, Tencent Cloud.    Powered by Discuz! X3.5    京ICP备20013102号-30

违法和不良信息举报电话:86-13718795856 举报邮箱:hwtx2020@163.com

GMT+8, 2025-5-12 08:42 , Processed in 0.208162 second(s), 17 queries .