【FCon】聚焦金融行业在数智化的全面革新,一线的金融数智化实践干货 了解详情
写点什么

C++ 实用指南

  • 2021-07-22
  • 本文字数:4363 字

    阅读完需:约 14 分钟

C++实用指南

6 月 17 日,极客时间《企业级 Agents 开发实战营》正式上线,10 周掌握企业级 Agents 从设计、开发到部署全流程。

C++发展得非常快!例如,C++标准的页数从 C++98/03 的 879 页增加到了 C++20 的 1834 页,多了近 1000 页!更重要的是,C++每次修订后,我们都会获得几十个新特性。你需要学习所有这些东西才能写出好代码吗?如何在当今的 C++世界中保持理智?

介绍


你可能知道 C++是一种复杂的语言。我甚至发现了一整页Wiki是讲对 Cpp 的批判的。现代 C++甚至为生态添加了更多内容。


以下是我之前提到的规范页数的完整数据:


  • C++98/03-879,N1905,2005 年 10 月

  • C++11-1324,最后草案,N3337,2012 年 1 月

  • C++14-1368,最后草案,2014 年 11 月

  • C++17-1586,草案,N4606

  • C++20-1834,草案,N4861



看起来 C++17 几乎比 C++98/03“大”了 80%,而 C++的最新草案比 C++03 多了将近 1000 页。你可以抱怨增加的这些复杂性,想学好所有这些东西也很困难。但这有那么可怕吗?面对这样的情况,你能做些什么?


首先,我们来看看你在 C++中可能会遇到的一些问题。

一些问题


仅举几例:


  • 节奏太慢

  • 节奏太快

  • 特性的混乱/复杂性

  • 编译时间慢

  • 缺乏依赖管理


我们来仔细研究一下。

节奏太慢


2017 年,我们迎来 C++17。虽然每三年就迎来一个新标准是很棒的,但许多开发人员抱怨新版本并不是每个人都期待的。


很多特性:比如概念(concept)、模块、范围(range)、协程(co-routine)……都没有被接受,我们至少需要再等三年才能让它们进入规范。


在 2020 年,C++20 已经准备就绪,并且这些重要特性将随编译器一起提供!但我们还是会抱怨合约(contract)还没加进来,反射(reflection)、执行器(executor)或网络(networking)仍在讨论中。它们可能出现在 C++23 甚至更高版本中。


看起来有些特性接受起来比较慢……而且总有东西值得抱怨。

节奏太快


像往常一样,我们在这里可能有两种相互矛盾的意见。尽管对某些人来说升级节奏很慢,但对其他人来说却很难跟上变化。


你刚刚学习了 C++11/14……现在你就需要更新 C++17 的知识,然后 C++20 就在路上了。三年并不是那么短的时间,但请记住,编译器一致性、公司政策、团队指南可能会以不同的节奏前进。


你的公司是立即更新到最新的 C++版本还是等待几年?

特性的混淆/复杂性


只需阅读这条评论:


CallMeDonk


我喜欢 C++。这是我的首选语言,但你必须承认,它对值类的“大杂烩”实现是很怪异的。包括我在内的大多数程序员更喜欢简单的、定义明确的语言结构,而不是奇怪和复杂的语法。


C++在各个方面都很清晰吗?可能不是……


以下是一些可能难以理解并可能让程序员糊涂的主题:

移动语义


移动语义的原则非常明确:不要复制,而是尝试“窃取”托管资源的内部结构,你应该获得不错的性能提升。但魔鬼都藏在细节中。


我不会写很多通用代码,所以幸运的是,我不必一直考虑移动语义。但是,当我遇到 move 和 const 时会很困惑——请参阅我上一篇关于该主题的文章。我不相信所有 C++开发人员都会理解这里的规则。特别是你现在需要记住编译器生成的六个默认操作:默认构造器、析构函数、复制构造器、移动构造器、赋值运算符和移动赋值运算符。

Rvalues/xvalues/prvalues……myValues、fooValues


最后一个是我编的……但那么多值类别实在太让人头疼了!


在 C(或 C++98/03)中,你只需要知道左值与右值,现在它有点微妙了。


不过,问题是你是否需要记住它?


一些不错的评论:


c0r3ntin


这很复杂,但不是每天都能遇到。这个值可以 address 吗?可以复制吗?可以移动吗?应该移动吗?只有在极少数情况下,你才需要主动去澄清并充分理解它们。(模板化库编写、热路径等)。大多数时候 C++并不比 java 或其他东西复杂。可悲的是大多数人都忘了这一点。C++可能是最复杂的语言,但是你可以编写非常好的代码而无需关心具体的细节。BigObject o=getBigObject();

初始化


现在有 18 种方式(从 C++17 开始)!


参阅:C++中的初始化是疯狂的r/cpp线程

模板(和模板推导)


当我看到 C++17 的所有变更时,我很迷茫;关于模板的细节太多了。


同样的情况发生在 C++20 中,我们迎来了一个重大且期待已久的改进:概念——它彻底改变了 C++。


然而,如果你想学习模板,一开始可能会不知所措。

ABI


随着新特性列表的不断增长,“从头开始”修复 C++设计中的旧问题可能是很诱人的主题。但这种语言的原则是不能破坏旧代码,所以委员会非常严格,不喜欢改变已引入特性的路线。


这个问题没有正确的答案,但无论如何,一个经过充分讨论的主题要比仓促的举动更好。

缺乏依赖管理工具


我们可以抱怨 C++没有“交​​付”一个很酷的依赖管理系统。但现实情况是,在可预见的未来,这可能都不会实现。拥有一个“标准”的包管理器是一个艰难的选择,尤其是它必须处理如此多的可用 C++的平台和系统。

不够安全


前段时间,你可以读到提到这个问题的一些文章(这篇这篇):


谷歌工程师本周表示,Chrome 代码库中大约 70%的严重安全漏洞是内存管理和安全漏洞。


微软也是如此。由于大部分代码是 C 或 C++,所以每个人都指责 C++不够安全。

其他问题?


你在这种语言上遇到的主要问题都有哪些?


到目前为止,我们已经讨论了一些问题……那么如何应对它们呢?有机会解决这些问题吗?

如何保持理智


没有完美的编程语言;每种语言都有一些问题。以下是我关于如何处理现代 C++问题的建议:


  • 保持乐观

  • 使用最佳指南

  • 使用最好的工具

  • 跟上最新进展

  • 不要打开引擎盖

  • 使用你需要的

  • 增量变更

  • 最后的底线:你的旧代码仍然安全并且可以编译

保持乐观,语言在不断发展


没有人愿意使用旧的语法和结构来编写代码。我们已经看到很多关于 C++11 之前的旧版 C++的抱怨。人们花了将近 13 年的时间(从主要的 C++98 算起,不包括次要的 C++03)才提出新的主要版本:C++11。现在我们可以很高兴回到了正轨,每三年都会有一些变化。归根结底,你不能说你的语言已经死了。


虽然某些特性非常庞大,可能会带来混乱或需要学习更多东西,但实际情况其实很简单:


  • 在 C++03 之后添加的 1000 个新页面中的大部分用于标准库。这意味着你可以使用更多助手和子系统,而无需查找第三方库。这绝对会让你的生活更轻松。

  • 对于移动语义,你可以依赖库类型,因为它们会为你完成正确的工作。例如,你现在可以安全地返回std::vector并确保它可能被移动甚至被删除,而无需额外副本。

  • 至于模板,它变得越来越容易使用。概念让代码更安全,没有像 SFINAE 这样的技巧。更重要的是,我们有了constexprauto,让泛型代码更简单了(几乎就像常规代码一样)。

  • 至于安全性:在这里查看 C++指南的安全配置文件的自动化工具。C++ Core Check中的新安全规则|C++团队博客。我们可以期待新的、更好的工具来执行代码分析甚至检测,以尽快发现潜在的安全问题。或者看这篇文章:使用静态分析原理缩小Rust和C++之间的差距——SunnyChatterjee——CppCon

使用指南


如果你对 C++代码的许多方面都感到困惑,那么你应该查阅 C++核心指南。它由热心的 C++开发社区创建,主要编辑是 Herb Sutter 和 Bjarne Stroustrup。


看这里:

C++核心指南@Github


这里有一个漂亮的网站:

C++核心指南:网站


只需输入你面临的问题(例如return value),你就可以轻松找到建议——例如:指南:返回值


使用这些指南将为你节省大量时间,并且你可以非常快地学习一些好的模式。

还有工具!


感谢 Clang 以及其他平台上的开发速度提升,我们获得了如下工具:



或者查看我关于其他工具的文章:C++生态系统:编译器、IDE、工具、测试等


虽然它不像其他语言(主要基于 Java 或基于.NET)那么好,但它正在变得越来越好。请记住,由于 C++语法复杂,因此很难实现即时分析代码的工具。

努力跟上最新进展


C++社区非常活跃。有很多博客、书籍、会议……甚至有可能在你所在的城市有本地社区。


首先,我建议去 isocpp.org 查看所有事件/新闻/文章。然后你可以查看Meeting C++和有关本地C++小组的信息。还有reddit/cpp,你可以在那里看到一些最棒的 C++故事。


还有CppCast——一个针对 C++开发人员的每周播客。


并参考以下书籍:



你还可以查看推荐的 C++资源列表:


Bartek的编程博客:资源

细节太多了?


C++如此强大的原因之一是它允许你实现非常接近底层的代码。你可以控制所有细节、内存布局、性能优化等……同时,这些能力增加了语言的复杂性。


不过,如果你不需要走那么远,你可以停留在相对较高的抽象级别。


例如,你不需要编写可选类型,因为你可以使用标准库中的std::optional。如果你不想涉及低级别和容易出错的联合类型,你应该意识到std::variant是一个安全的选项。

使用你需要的东西


C++是一种多范式语言;你可以以多种不同的方式使用它。最近,我读到了一条有趣的评论,说 Cpp 程序员在不接触模板元编程甚至异常等高级内容的情况下,也能持续多年表现出色。这在很大程度上取决于项目的代码风格。


例如,即使像谷歌这样的公司也限制了 C++的特性,比如说他们不使用异常


如果你不是库开发人员,你可能不会遇到自定义移动运算符或移动构造器的麻烦。同样,高级元编程的内容也可能不是你的代码的关键部分。

增量变更


如果你是从头开始或只有一个小的代码库,那么转到 C++11/14 应该相对容易一些。可是 20 年(或更久!)前开始创建的上百万行代码呢?


只需一步一步来就行了。


至少对于新代码,你应该开始使用现代 C++。此外,通过应用“童子军规则”,你可以改进你所接触的那些代码。


这可能会带来一些混合代码,但还是比只保留老旧风格要好。

最后的底线:你的旧代码仍然可以编译


C++规范越来越大的原因之一是该语言向后兼容。所以委员会通常会引入新特性,但很少删除旧的东西。所以……你的代码仍然可以编译。如果你不想前进,不想使用新的东西,那么你还是可以保持当前的风格。


有时你会收到一些关于不推荐使用的内容或删除特性的警告(如 C++17 中的auto_ptr),但即使在这种情况下,你也可以将编译器切换到一些较旧的 C++标准。

总结


这篇文章有一些抱怨,也有一些“美化”。我试图找出这种语言及其演变过程中存在的各种问题,以及一些积极的改进迹象。虽然我们可以抱怨复杂性、变化的速度等,但我认为我们不能说这种语言已经死掉了。这是好事!:)


我认为你不必快速追逐新特性并立即重写现有代码。试着跟上进展,使用真正改进你工作的特性,你的代码应该逐渐改进并变得更加“现代化”(这是可以定义的,请参阅 meetingcpp 的相关文章)。


  • 在采用 C++11/14/17/20 的新特性时,你的方法是什么?

  • 你使用 C++的主要问题是什么?

  • 你在工作中使用现代 C++吗?


原文链接:


https://www.cppstories.com/2017/02/how-to-stay-sane-with-modern-c/

2021-07-22 10:006151

评论 1 条评论

发布
用户头像
“不够安全” 这个问题解决不了的话比不过Rust的。
2021-07-22 13:40
回复
没有更多了
发现更多内容

第一个程序:HelloWorld——IDEA 使用

小齐写代码

优化模型之“显示置信度”

矩视智能

深度学习 机器视觉

好用的图书阅读器 OmniReader Pro激活中文版

胖墩儿不胖y

Mac软件 图书阅读工具 图书阅读

ABBYY FineReader PDF 15 Mac中文版(ocr文字识别软件)

晴雯哥

启动!中交集团携手用友搭建海外人力资源数智化平台

用友BIP

中企出海 数智人力

亚马逊云科技2023柏林峰会主题演讲总结

亚马逊云科技 (Amazon Web Services)

Amazon AIGC

WorkPlus国产化即时通讯工具:安全可靠的国内沟通利器

WorkPlus

百万架构师亲码的亿级流量下的分布式限流解决方案

小小怪下士

Java 程序员 高并发 秒杀

七个有用的 GIT 命令

高端章鱼哥

git git 规范

深入理解树状数组 | 京东物流技术团队

京东科技开发者

bit #数据结构 企业号10月PK榜 树状数组

API接口安全运营研究

Noah

API接口文档 API 安全 API接口安全

开源生态建设,正成为智能世界发展的关键

新消费日报

中国机械总院张红新:强化集团级数据治理 业财融合助力企业降本增效

用友BIP

业财融合 2023全球商业创新大会

使用 Databend Kafka Connect 构建实时数据同步

Databend

安全高效的政企内部通讯解决方案WorkPlus IM平台

WorkPlus

2023 KiCon Asia 11月12日 深圳见!

华秋电子

kicad

超越React,JS代码体积减少90%!它为何是2023年最好的Web框架?

互联网工科生

Vue React Web框架 Astro

云管理平台基本功能有哪些?适配国产化平台吗?

行云管家

云计算 信创 国产化 云管平台 云管理

WorkPlus即时通讯app打通业务与生态,实现高效管理与协同

WorkPlus

企业门户的必备选择,WorkPlus的定制化解决方案

WorkPlus

当 AI 成为“逆子”;强化学习之父联手传奇程序员丨 RTE 开发者日报 Vol.62

声网

MQ技术比较

周晓宁

cad设计绘图软件:AutoCAD 2024最新版中文

mac大玩家j

CAD绘图 CAD设计 cad cad工具

用友全球司库十问(四)|企业如何实现融资债券数据信息的实时监控?

用友BIP

全球司库

鲲鹏DevKit 23.0:流水线中便捷迭代鲲鹏版本,迁移、开发、调优无缝衔接

彭飞

可视大盘+健康分机制,火山引擎DataLeap为企业降低资源优化门槛!

字节跳动数据平台

大数据 数据治理 成本治理 企业号9月PK榜

利用美国服务器增加线上业务的客户人群

一只扑棱蛾子

服务器 美国服务器

WorkPlus定制化的局域网会议软件,提供安全稳定的会议体验

WorkPlus

【数据库审计】2023年数据库审计厂家汇总

行云管家

数据库 数据库审计 等保合规

JPEX事件对于香港加密货币发展的影响

区块链软件开发推广运营

数字藏品开发 dapp开发 区块链开发 链游开发 NFT开发

Java 21:虚拟线程介绍

这我可不懂

java 虚拟线程 java 21

C++实用指南_编程语言_Bartlomiej Filipek_InfoQ精选文章