欧易

欧易(OKX)

国内用户最喜爱的合约交易所

火币

火币(HTX )

全球知名的比特币交易所

币安

币安(Binance)

全球用户最多的交易所

C++的强大背后你知多少?浅析C++两三问题助你初步了解C++

时间:2022-10-09 17:40:24 | 浏览:414

C++是一门通用编程语言,支持多种编程范式,包括过程式、面向对象(object-oriented programming, OP)、泛型(generic programming, GP),后来为泛型而设计的模版,被发现及证明是图灵完备的,因

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更多,苹果clang的支持度也很不错。

(注:目前C++已经从C++11、C++14更新到C++17了,未来语法支持还会不断发展,各厂商编译器支持度也会不断跟进)

应否选择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++的性能优点并非免费午餐,代价包括较长的编译链接时间和较易出错,因而增加开发时间和成本,这点稍后补充。

我进行了一个简单全局渲染性能测试(512×512像素,每像素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/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语言基础

¥100

10人已购

查看

通俗易懂,深入浅出,一个视频只讲一个知识点。视频不深奥,不需要钻研,在公交、在地铁、在厕所都可以观看,随时随地涨姿势,人人都可以学习。

相关资讯

云浮家长对于运动了解多少?30秒带你了解少儿篮球,了解幼儿教育

​天马体育天马华蒙星少儿篮球俱乐部自成立以来培养出了一代又一代的“少儿篮球运动员”我们共同经历了很多风雨与磨练,与孩子们一起成长我们天马体育感到欣慰看到孩子一张张笑脸一天天的成长一天天的快乐我们感到快乐所有的付出都是值得的让我们一起回顾属于

认识一下轿车轮胎规格标识,多了解了解有益无害

以米其林为例,详细说一下米其林轮胎人必比登轿车轮胎规格标识目前,常用的轮胎尺寸标注形式有以下两种:1.欧洲形式全世界通用,高宽比出现在规格描述中。示例1:195/65 R15 91V195/65 R15 91V轮胎规格195 -横截面宽为1

德州,你了解的和不了解的都在这里了

5月19日,德州市副市长范宇新在中国推介《好客中国》向世界推介德州:“儒风水韵,大德之州”。是时候让大家,认识认识咱们大德州了!我叫德州这是我的基本信息这是我的名片姓名:德州外文名:Dezhou City别名:安德,德县常驻人口:581万人

在了解中纤板之前,你需要了解一下密度板

中纤板是装修材料的一种,大家不熟悉它也是可以理解的,它属于密度板的一种,也就是说要想了解中纤板,首先需要对密度板进行一个大致的了解。今天这篇文章就将为大家普及一下关于这方面的装修知识,帮助大家了解密度板与中纤板。一、什么是密度板?密度板是纤

商标转让的原则与流程,你了解吗?

一些企业为了更好地保护自身品牌而注册商标,节约商标注册的时间,也有购买转让商标的。商标转让是商标注册人在注册商标的有效期内,依法定程序,将商标专用权转让给另一方的行为。一、商标转让的原则1.注册商标在先申请的原则在商标转让行为中应遵循商标在

商标转让应当了解的基本常识

摘要:商标转让是盘活商标价值的重要手段之一,但是在进行商标转让时,双方都要注意降低自己的风险,并且向商标局申请核准。而且在商标转让前,大家必须要先了解这几点基本常识,避免发生商标纠纷等。一、未拿到商标注册证的商标是否可以进行商标转让呢?虽然

seo搜索引擎优化-了解搜索引擎规范 提高网站关键词排名附SEO工具

seo搜索引擎优化,什么是SEO搜索引擎优化。简单点来说就是用户通过搜索引擎搜索想要的结果第一时间找到你的网站。那我们怎么做好搜索引擎优化呢?要做好搜索引擎优化首先我们得了解首页引擎。怎么才能快速的了解搜索引擎。不管是百度/360/谷歌/搜

易合网:有几种类型的网站,你了解吗?

现在越来越多的企业想要制作一个网站开发,但不知道具体的网站类型是什么,也不知道网站的重点是什么。下面易合网今天就把下面的干货分享给大家:有几种类型的网站:1.展示型网站这种网站建设很常见,不具备很多特殊功能。一般都是只要满足公司信息、产品介

求职登记、就业网站、基层项目……一组图了解如何找到心仪工作

来源:人民网 原创稿毕业生如何进行求职登记?求职常态化网站有哪些?这些基层项目你是否了解?想要了解更多关于求职的小技巧,来看小贴士——整理:黄玉琦、温璐、实习生袁宁设计:杜佰鸾

商标分类表,申请商标必须要了解45个类别范围?

商标是区别商品或服务的一种标志,每一个注册商标都是指定用于某一商品或服务上的。注册申请时需根据商标所使用的商品或服务范围来选定大的分类(共45类,1 - 34商品类,35 - 45服务类)。以下为商标分类表类别介绍,可根据商标使用行业领域自

你了解什么是商标吗?

摘要:对于商标是什么这个问题,简单地说,商标就是商品或服务的一个标记,是可以将不同经营者和生产者的商品或服务区分开来的标志。那么大家对于商标了解多少呢?下面就跟着小编一起来看看吧。商标常识1、什么是商标呢?商标是由文字、图形、数字、颜色组合

了解关于商标的一些小知识

商标是用来区别一个经营者的品牌或服务和其他经营者的商品或服务的标记。我国商标法规定,经商标局核准注册的商标,包括商品商标、服务商标和集体商标、证明商标, 商标注册 人享有商标专用权,受法律保护,如果是驰名商标,将会获得跨类别的商标专用权法律

商标知识:商标的十大分类,你了解多少呢?

文字商标文字商标就是指用文字所构成的商标,这其中包括中国的汉字和少数民族字、外国文字和阿拉伯数字或各种不同的字组合而成的商标,就比如我们常看到的:蒙牛,可口可乐,心心相印等等。图形商标图形商标就是指用图形构成的商标。图形商标又可以分为好几种

三分钟带您了解商标注册流程及费用

商标申请须知:自然人、法人或者其他组织在生产经营活动中,对其商品或者服务需要取得商标专用权的,应当向商标局申请商标注册。狭义的商标注册申请仅指商品和服务商标注册申请、商标国际注册申请、证明商标注册申请、集体商标注册申请、特殊标志登记申请。广

快速了解五种常见商标类型的区别

商标注册申请是商标使用的基础,在商标注册申请过程中,灵活地运用商标注册策略,对保护商标及商标权,开拓国内外市场有着非常重要作用。商标分为5种常见的类型,分别是:商品商标、集体商标、服务商标、驰名商标、证明商标。这些类型彼此有哪些区别呢?商品

友情链接

网址导航 SEO域名抢注宝宝起名网妈妈知道币圈美的空调资讯网酒吧资讯网七匹狼股票行情热水器品牌网国际象棋培训网石油期货行情网湖南衡山资讯网捷克旅游网生肖鼠运势网美的冰箱评测网虎跳峡旅游攻略PS抠图网迪士尼乐园攻略网佛山头条新闻网郑恺影迷网
c语言中文官网-零基础c++从入门到精通pdf、c语言编译器、C/C++开发工具、c语言入门自学零基础、c++入门自学、c/c++软件下载、c语言编程软件、c语言自学免费网站、c语言零基础自学视频教程、c++手机编程软件、c语言入门程序设计、初级编程视频教程、c语言在线编程平台、C语言线上作业网站。
c语言中文官网 chuxinxin.cn ©2022-2028版权所有