首页 > 语言 > 关键词  > C++语言最新资讯  > 正文

C++强大的背后

2010-09-17 11:31 · 稿源:Milo的游戏开发,www.cnblogs.com/miloyip

在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++也可以直接使用操作系统提供的内存相关功能,例如内存映射文件、共享内存等。

举报

  • 相关推荐
  • Checkout.com携手Visa推出发卡业务 (Card Issuing)

    Checkout.com与Visa达成战略合作,在英国及欧洲地区推出全方位发卡业务。通过Visa全球支付网络,商户可即时获取收款资金用于支付供应商款项,显著提升资金使用效率。该合作特别针对旅游业企业,解决其支付流程分散、资金周转慢的痛点。Checkout.com每年处理数千亿交易的技术能力与Visa网络结合,帮助商户消除预存资金需求,优化现金流管理。双方表示这将大幅提升欧洲商户运营效率,释放增长潜力。

  • 苹果iOS 26公测版升级教程来了:iPhone 11系列及之后机型都能体验

    日前,苹果正式推送了首个iOS 26公测版。 这次苹果放弃了iPhone XS、iPhone XS Max和iPhone XR三款机器,iPhone 11系列、iPhone SE二代及后续机型,均可升级。 作为公测版,目前日常使用已经趋于稳定,没有什么硬性bug,卡顿和发热、耗电情况也比之前好了很多。 而且公测版覆盖范围更大,普通用户想要体验,也能非常方便的申请资格,体验全新设计。

  • Checkout.com项尧受邀参与 WAIC2025 共话人工智能时代跨境支付新机遇

    2025世界人工智能大会(WAIC)于7月26-28日在上海举办,全球领先支付解决方案提供商Checkout.com受邀参与"无界人工智能:深化中英合作"主题论坛。其大中华区总经理项尧与行业专家探讨AI赋能跨境商业生态的创新实践,重点分享公司在代理电商平台(Agentic Commerce)领域的支付技术创新,包括与Mastercard、Visa合作构建支持AI代理交易的技术框架。作为支付行业领军者,Checkout.com通过智能支付网络帮助电商平台优化交易管理,支持多币种支付,每年为客户解锁数亿美元收入潜力。本届WAIC展览面积首次突破7万平方米,吸引800余家企业参展,涵盖40余款大模型及60余款智能机器人。

  • 蓝耘元生代MaaS × Kimi K2 × Claude CodeUI,开启编程效率革命

    蓝戟元生代MaaS平台推出"Kimi K2×Claude CodeUI"AI编程解决方案,通过国产首个万亿参数MoE架构开源模型Kimi K2驱动Claude Code,实现本地化部署。该方案具有三大优势:1)成本直降90%,免翻墙使用;2)支持128K超长上下文处理,编程能力超越主流模型;3)提供600万token免费额度。平台采用交互式界面设计,支持移动端操作和WebSocket通信,集成文件管理、Git工具和会话追踪功能,�

  • 185亿元!京东拟收购德国零售商Ceconomy

    据媒体报道,京东集团宣布通过旗下德国子公司JINGDONG Holding Germany GmbH,向欧洲消费电子零售巨头CECONOMY AG所有股东发起自愿公开收购要约,拟以每股4.60欧元现金收购其全部流通股份,并建立战略合作伙伴关系。 目标公司CECONOMY估值约22亿欧元(约合人民币185亿元),旗下运营MediaMarkt和Saturn两大品牌,在欧洲12国拥有870余家门店。该公司于2017年从麦德龙集团分拆独立,是欧洲�

  • 52TOYS携潮流IP矩阵亮相美国SDCC漫展 自有IP备受玩家追捧

    2025年7月24-27日,中国潮玩品牌52TOYS携旗下Pouka Pouka、CiCi Lu等原创IP系列亮相全球顶级动漫展圣地亚哥国际动漫展(SDCC),展位人气火爆。同期还参展了东京Wonder Festival夏季展。这是52TOYS首次在海外集中展示自有IP矩阵,其复古毛绒设计等产品获得跨文化消费者的喜爱。自2018年首次参展以来,52TOYS海外业务快速增长,2024年国际收入达1.47亿元,复合增长率超100%。目前品牌已在美国开设首家门店,通过多元场景触达全球消费者,持续推动中国潮玩文化出海。

  • 男子被鱼刺扎伤手指住进ICU:多器官功能衰竭

    深圳市民张先生近日在家处理叉尾鮰鱼时,因手指被鱼刺扎伤引发致命感染,最终转入ICU抢救。 经医疗团队诊断,其伤口感染了高致死性的创伤弧菌(又称海洋弧菌),迅速进展为脓毒血症及多器官功能衰竭,生命一度垂危。 创伤弧菌作为革兰氏阴性菌,广泛分布于海洋环境及海产品中。它不仅漂浮于海水,更密集附着于牡蛎、螃蟹、海鱼等表面,甚至可存在于入海口区域�

  • @毛光光 解约背后,MCN和红人“同床异梦”

    太阳底下没有新鲜事。2025年,达人和MCN分手、解约的故事仍在重复上演。 7月16日,全网粉丝量超过2000万的头部剧情达人@毛光光 在自己的抖音新账号@毛光光(重新出发)中正式官宣了自己和原公司解约、单飞的事宜。 视频中,他表示目前已将原账号全部交还给公司,其中包含粉丝量1000多万的抖音账号。谈到分手原因,他称自己和公司的合作一直非常愉快,不存在闹掰一说�

  • 14岁女生解约MCN被索赔家长发声 律师称MCN已涉嫌违法

    ​据小云母亲李丽反映,小云在初二时因“读不进去”执意离家去济南,并于 2023 年 9 月与一家MCN公司签下为期五年的合作协议。合同中详细规定了小云作为主播的工作要求,包括每月直播天数、时长、刷量标准及高额的违约赔偿条款,同时几乎规避了公司的所有法律责任。

  • 旷世之声QCC Dongle Pro发布|让苹果设备无线畅听LDAC无损音质

    QCC Dongle Pro和QCC Dongle是全球首款获得苹果MFi认证的无损蓝牙发射器,突破性地实现了苹果设备无线无损音质传输。产品基于高通Snapdragon Sound™技术和索尼LDAC高清音频编解码协议,支持aptX、aptX HD、aptX Adaptive、aptX Lossless等多种编码格式。QCC Dongle Pro还独家支持LDAC编码,传输速率高达990kbps。该产品已通过日本VGP大奖认证,7月18日在京东首发售价599元,为苹果生态用户带来更丰富的高品质无线音频体验。