C++性能优化大局观算法编程标准库编译器c++软件安装包

C++可算是一种声名在外的编程语言了。这个名声有好有坏。从好的方面讲,C++性能非常好,哪个编程语言性能好的话总忍不住要跟C++来单挑一下。从坏的方面讲,它是臭名昭著的复杂、难学、难用。

不管说C++是好还是坏,不可否认的是,C++仍然是一门非常流行且非常具有活力的语言。继沉寂了十多年后发布语言标准的第二版——C++11——之后,C++以每三年一版的频度发布着新的语言标准,每一版都在基本保留向后兼容性的同时提供着改进和新功能。

虽然在语言领域,也有Rust这样的新语言在向C++发起挑战,但是,不可否认的是,C++仍然是面向性能的领域里的编程语言王者。我甚至不认为C++在性能方面次于C——在极致追求速度时,C++可以比C更强,而C相比C++的主要优点是更加简单:不管是学习、使用,还是产生的二进制代码的体积上。

今天,我们就来大略讨论一下,C++是如何做到高性能的。

跟C语言一样,C++提供非常底层的数据操作能力,为开发者提供了灵活性。跟“高级”语言一样,C++提供了强大的抽象能力(可以说超越了大部分语言)。而且,相比C,C++要安全得多。在语言诞生的初期就是如此,现在就更不用说了。

C++的类型系统比C更加严格,因此虽然一直有C++是C的超集的说法,这个说法严格来说从来就没成立过。最近(2023年)碰到过一个程序崩溃的案例,简化来讲,就是开发者使用了一个char的二维数组(charnames[MAX_NAMES][MAX_NAME_LEN]),然后把它传给了一个接收char**参数的函数……这代码当然是错的,但C编译器虽然给了个告警,但编译还是没有失败。如果这是C++代码的话,那编译器就会直接报告错误,不给通过了。

而第二点,零开销抽象,对于C++的性能至关重要。我们有很多的抽象机制,同时,使用这些抽象机制并不会带来额外的开销。在某些情况下,使用这些机制,反而有“负开销”——“使用者”可以非常安全地使用这门语言,即可获得极高的性能。同时,C++还给予了“定制者”根据自己的需求来写出更贴近使用场景的库的能力,可以进一步方便“使用者”。

当然,定制对程序员的技能有非常高的要求。初学C++的更需要掌握C++的标准库的使用——用好标准库,就能获得非常不错的性能。正如高德纳大神的名言的完整版:

就在同一篇论文的同一页上,高德纳还写下了:

在成熟的学科里,对于12%的提升,如果易于获取的话,那绝不会被认为是微不足道;我相信,在软件工程里,相同的观点也会占上风。

而C++已经提供相当多的机制,可以允许我们很容易地获取高性能,在很多场景下远远超过高德纳所说的12%。

我经常举的一个例子是C++标准库的sort和C标准库的qsort:在关闭优化时,我在某一测试场景下得到了1:2.5的性能差异,C++似乎要慢不少;但一旦打开-O2(允许内联)时,两者的性能差异突变成3.5:1,C++的性能比C高出了好几倍!这就是所谓的“负开销”了。C++的代码比C的更简单、更直观,性能还更高。原因自然就是C++的函数对象和模板机制允许编译器更好地进行内联,从而产生更加高性能的代码。

任何情况下学习C++,第一需要了解的就是析构函数和RAII(resourceacquisitionisinitialization)惯用法。对,虽然C++诞生时名字是“带类的C”,但类和面向对象并不等同,对面向对象编程的支持并不是C++的最重要特性。C++的自定义类型的最特别之处不在多态,而在对其行为的定制上——最重要的就是对象销毁时应该做些什么。析构函数和析构函数带来的RAII惯用法,是C++里最重要的特性,也是用C++进行资源管理的关键。

重载是另外一个非常重要的C++特性。除了你不用在名字上区分process_char、process_string、process_int带来的方便性外,它对泛型编程也很重要,还对现代C++的一个基本特性“移动语义”非常重要。刨除语法上的细节,本质上来说,移动语义就是让程序员可以方便地区分会继续使用的对象和以后不再使用的对象,允许对后者使用构造函数和赋值运算符的重载来“窃取”其中的资源。对于一个普通的vector,拷贝的开销是O(n)或更高(如果vector成员是容器或其他具有高拷贝开销的对象),但移动开销通常(是,只是通常;不过通常你也不会遇到这种例外的特殊情况)是O(1),常数复杂度。这就是我们在C++里高效传递对象的一种常见方式了。

C++标准库里最常用的组件恐怕就是string和各种容器了。它们都对移动进行了优化。当然,除了这个基本的性能点外,容器都有各自的特殊性能点,比如不同情况下的插入性能差异。这些都是需要学习的地方。

前面我们已经提到过模板,而string和容器也都是模板,行为可以通过模板参数来进行定制,并允许高效的内联优化。模板当然是C++里比较复杂的一个地方,但基本的使用则相当简单:vector就是一个放int的vector,用起来跟一个普通的类没有区别——只是模板创建者的工作简单多了,不需要手工为不同的类型创建不同的类。

用好C++、在项目中获得令人满意的性能当然不止上面这一些。最基本的,我们还需要了解标准库算法,并合适地使用并发和并行来充分利用硬件。在本文中我们暂且就不展开了。

当我们用熟了C++之后,慢慢地,我们就会不再满足于C++标准库这一“制式武器”。我们会寻找适合自己的第三方库,甚至自己造轮子来满足项目的特定需求。此时,我们就需要进一步了解C++的高级特性。我们需要了解模板的进一步细节,尤其是特化。我们需要了解SFINAE和模板元编程。我们需要了解constexpr和它带来更方便的编译期编程。C++的使用者也许可以暂时不关心这些问题,但定制者,或者说项目里的框架搭建者和工具提供者,必须去了解C++的这些高级特性,为你的项目提供扎实的基础。

这种情况下,最合理的选择是使用某种intrusive_list,侵入式的链表,不需要在每次插入或删除时进行内存管理。C++标准库没有提供这个功能。你可以使用Boost里提供的容器,或者自己写一个新的。对于这个例子,Boost多半就足够好了。但总可能出现一些现成库解决不了的问题的,这时候,利用C++的高级特性来自己造轮子就是一件非常自然的事。我们可以做到既有合适的定制,同时用法又跟已有的容器相似,没有额外的学习成本。

或者,也许你希望使用分配器来创建一个容器内存池,来提供对内存的使用效率。这在C++里也是非常容易完成的,只要你了解合适的定制机制。根据洋葱原则,你可以不管这些定制点,直接用C++,这样最简单;也可以把标准库“切开”,以自己最喜欢的方式来拼接定制使用——当然,这种做法确实跟切洋葱一样,很容易就会哭鼻子的。但它确实能帮助你获得最高的可能性能

课程介绍

课程收获

名企好评

吴咏炜老师的《C++性能优化高端培训》课程是Boolan技术赋能培训的品牌课程,在华为、博世西门子、银科、大疆等很多著名企业内训都获得高度认可,得到参训学员一致好评。

该课程将于本周六(1月20日)正十开课,现在扫描下方二维码,都有机会领取C++之父的《C++白皮书中文版》

THE END
1.C++/CX,一个智能的C++/Windows平台开发库!概念解释:在C++/CX中,数据类型和普通C++类似,有整数、浮点数、字符等基本数据类型。变量呢,就像是一个盒子,用来存储数据,你可以给它起个名字,然后把不同的数据放进去。 代码示例 #include <iostream> intmain() { intnum =10;// 定义一个整数变量num,并赋值为10 https://blog.csdn.net/qq_42554007/article/details/144361246
2.c++开发游戏用什么软件c++开发游戏用什么软件2024-01-01 精选回答 c++可以用vs编程。Visual Studio是一个集成开发环境,提供了丰富的工具和功能,方便开发者进行c++开发。它包括代码编辑器、调试工具、代码管理工具等,可以帮助开发者更高效地编写、测试和部署c++代码。同时,Vs还支持多种操作系统和平台,可以满足不同开发需求。总之,Vs是一个https://wap.hxsd.com/wenda/70910/
3.ipad上有可以编c++的软件吗?安卓端有c语言的编写工具,名为c4android,通过这款软件,可以进行c/c++的程序编写,不过不支持文件保存,也不支持工程的编译。如果希望在平板电脑上使用c++编程,建议使用windows系统平板。其与电脑的系统完全相同,因此支持电脑软件,可以使用vs等编程工具进行完整的程序编辑和编译。 有用(0) 回复 举报 https://wap.zol.com.cn/ask/details_19262472_1207876_3.html
4.C++应用软件开发从入门到精通详解https://blog.csdn.net/chenlycly/category_2276111.html用C++开发软件,主要包含两大类,一类是工具软件与客户端软件的开发,一类是服务器程序的开发(运行在Windows Server服务器上)。我们日常工作学习使用的都是Windows桌面系统,会频繁地使用到各式各样的工具与客户端软件。本文详细介绍一下用C++开发应用软件的诸多内容http://www.zsrm.cn/news/165779.html
5.C++绘图用什么软件问答在C++中进行绘图通常需要使用图形库来实现,常用的图形库有:1. OpenGL:OpenGL是一个跨平台的图形库,可以用来实现2D和3D图形绘制。2. Qt:Qt是一个跨平台的应用程序开发框架https://www.yisu.com/ask/85436436.html
6.C/C++testParasoft中国官网用于C/C++软件开发的统一、完全集成的测试解决方案。通过将Parasoft C/C++test集成到嵌入式安全和安全关键型应用的软件开发中,及早发现缺陷并节省资金。确保符合各种功能安全和编码标准。https://www.parasoftchina.cn/products/ctest/
7.17.开发环境可以在Yast的软件管理里面,搜索包的名字来安装,也可以用root命令行执行命令:zypper in gcc gcc-c++ GNU编译器里还有其他编程语言的,如gcc-ada,gcc-fortran ,gcc-java ,gcc-objc等等,可以根据自己需要安装。 安装gcc和gcc-c++这两个软件包,软件包管理器会自动安装它们的依赖包:https://lug.ustc.edu.cn/sites/opensuse-guide/develop.php
8.C++开发面经与嵌入式软件面经(蒋豆芽专栏总结)完成了!本专栏适合于互联网C++软件开发、嵌入式软件求职的学生或人士。 适合基础比较好的同学,本专栏针对面试题答案进行了优化,尽量做到好记、言简意赅。 针对于非科班和基础不太好的同学,建议学习本人专刊文章《蒋豆芽的秋招打怪之旅》,该专刊文章对每一个知识点进行了详细解析。本专刊采用讲故事的形式为大家串联、呈现https://www.jianshu.com/p/6c0917767ab9
9.VisualC++程序开发破解软件免费下载Microsoft Visual C++ 2020运行库【VC++ 2020】32/64位运行库 软件简介:Microsoft Visual C++ 2020的简介:microsoft visual c++2020,又称vc2020运行库,可以帮助计算机快速开发和管理相关编程语言,具有强大的代码编写功能,可以自动生成灵活方便的类别管理,非常方便。该软件由microsoft visual sudio编写,因此该软件的运行需https://software.3d66.com/list_274_483_0.html
10.c++用什么软件编程?C++开发环境推荐与比较选择合适的C++编程软件和遵循最佳实践,对于提高开发效率和代码质量至关重要。不同的IDE有不同的特点和优势,开发者应根据自己的需求和项目特点进行选择。同时,使用项目管理工具如板栗看板,可以提高团队协作效率。 除了编程软件和项目管理工具,开发者还应关注代码规范、单元测试等最佳实践,以确保软件的质量和可维护性。此外https://www.banlikanban.com/info/tool/toolchat/8493.html
11.vc运行库合集下载微软常用运行库合集202432/64位2024.11.07国内杀毒软件对大多数补丁都会报毒,包括官方版。 2、为什么安装的时候要关闭一些程序? 因为这些程序调用了老版本的VC运行库文件,导致文件可能无法成功更新,你可以选择关闭对应的程序。 3、如何选择版本? 32位系统选择32位版本的,64位系统选择32位+64位合集的版本。 4、Visual C++ 2015-2019 是什么意思? 就是它包https://m.jb51.net/softs/607905.html
12.推荐几种适合新手学习C++的软件21xrx.comC++是一门强大的编程语言,它不仅能够应用于编写操作系统和游戏,还可以用于Web开发、移动应用程序和人工智能等多个领域。对于初学者来说,选择一个好的学习软件可以大大提高学习效率和兴趣。下面是几个适合新手学习C++的软件推荐。 1. Code::Blocks Code::Blocks是一款免费的、开源的C++开发环境,适用于Windows、Linux和https://21xrx.com/Articles/read_article/218497
13.c++适合编写什么软件C++操作系统和系统软件:C++ 用于编写操作系统内核、设备驱动程序和底层系统实用程序,需要高效率和对底层硬件的直接访问。 游戏引擎:C++ 是游戏引擎开发的行业标准语言,因其能提供出色的性能、可扩展性和对图形渲染的深度控制。 嵌入式系统:C++ 广泛用于嵌入式系统中,例如汽车电子、医疗设备和物联网 (IoT) 设备,这些系统https://www.php.cn/faq/819309.html
14.c++用什么软件编程基本介绍:DevC++是一个轻量级的Windows平台C/C++集成开发环境,它提供了基本的编译和调试功能。 适用人群:由于其简洁的界面和基础的功能,DevC++特别适合初学者使用,可以很好地锻炼编程基本功。 教学使用:许多学校采用DevC++作为教学软件,帮助学生理解C++的基本概念和语法。 https://www.kdun.com/ask/663984.html
15.c++可视化编程软件开发c语言可视化编程软件php1. 什么是C++可视化编程软件? C++可视化编程软件是一种基于C++语言的可视化编程环境,它将编程语言与图形界面相结合,使得开发过程更加简洁、高效。C++可视化编程软件可以用于各种类型的应用程序开发,包括游戏开发、数据可视化、图形图像处理等。 2. C++可视化编程软件的发展历程 https://blog.yyzq.team/post/344082.html
16.C++软件开发需要学什么c语言电脑/ITC++软件开发需要学什么 在软件开发领域,C++是一种功能强大的编程语言,适用于多种应用场景,包括操作系统、游戏开发、嵌入式系统等。如果想成为一名C++软件开发工程师,需要掌握一系列相关的知识和技能。那C++软件开发需要学什么?以下是一些关键的学习内容: 1、编程基础:学习编程语言的基本概念和语法规则,包括变量、数据http://m.pxwy.cn/news-id-79530.html