【FCon上海】与行业领袖共话AI大模型、数字化风控等前沿技术。 了解详情
写点什么

C++ 实用指南

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

    阅读完需:约 14 分钟

C++实用指南

AI 大模型超全落地场景&金融应用实践,8 月 16 - 19 日 FCon x AICon 大会联诀来袭、干货翻倍!

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:006283

评论 1 条评论

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

一个老程序员对小浣熊 AI 办公助手的使用体验

汪子熙

Python 人工智能 办公小浣熊 小浣熊家族 小浣熊

我的数据分析大师-办公小浣熊

黑白相间

数据分析 办公小浣熊

破解缺陷管理:挑选顶尖系统的秘籍

易成管理学

缺陷跟踪

蓝易云 - Linux网络配置文件:MAC,UUID,设备名,子网掩码,网关,DNS等底层结构、架构图,工作原理 ,使用场景详解

百度搜索:蓝易云

Linux Mac 网络 DNS 云服务器

zFuse Pro 1.7.44激活版——万能视频播放器

影影绰绰一往直前

万字长文—带你深度体验小浣熊办公助手,全方位提升工作效率

Y-starrydreamer

办公小浣熊 代码小浣熊 小浣熊家族

我的数据清洗能手小浣熊

轻口味

征文活动 办公小浣熊 小浣熊家族

如何彻底解决ToB企业市场和销售脱节的问题

客户在哪儿AI

ToB营销 ToB获客 ToB销售

Microsoft Remote Desktop for Mac(远程桌面连接工具) 10.9.5正式版

影影绰绰一往直前

ToB活动营销痛点——用最少场次的活动投入覆盖最多的目标客户

客户在哪儿AI

ToB获客 ToB增长 ToB销售

ToB市场部如何选择最优的合作平台

客户在哪儿AI

ToB营销 ToB获客 ToB增长 ToB销售

C++大型流媒体项目-从底层到应用层千万级直播系统实战网pan

编程猿

C++\

小浣熊家族:自媒体新手的快速成长指南

程序员海军

AI 办公小浣熊 小浣熊家族 小浣熊

蓝易云 - Apollo配置中心介绍

百度搜索:蓝易云

云计算 Linux 运维 云服务器 Apollo

2024-07-13:用go语言,给定一个从0开始的长度为n的整数数组nums和一个从0开始的长度为m的整数数组pattern,其中pattern数组仅包含整数-1、0和1。 一个子数组nums[i.

福大大架构师每日一题

福大大架构师每日一题

城市:天际线Cities: Skylines for Mac(模拟建造游戏)+dlc 中文原生版

影影绰绰一往直前

信创里程碑:TapData 与 OceanBase 产品完成兼容互认证,加速推进金融等传统行业自主创新与数字化革新

tapdata

oceanbase 信创国产化 TapData 实时数据平台 国产信创数据库

Mac电脑轻量级图像查看器Lyn for Mac v2.4.0中文版

影影绰绰一往直前

上班摸鱼全靠AI办公助手-小浣熊

不叫猫先生

AI 办公小浣熊 办公助手

WonderPen 2.5.1 妙笔Markdown写作编辑

影影绰绰一往直前

专业无损图像编辑工具Pixelmator Pro for Mac下载

影影绰绰一往直前

Artstudio Pro for mac(绘图和编辑工具)v5.2.2永久激活版

影影绰绰一往直前

ToB活动营销先要区分战略级活动、常规级活动和与我无关的活动

客户在哪儿AI

ToB营销 活动营销 ToB获客 ToB销售

万能音视频转换器Permute 3 for mac激活版

影影绰绰一往直前

蓝易云 - linux IP地址原理,分类,子网划分,VLAN,TRUNK详解

百度搜索:蓝易云

运维 Web IP 网络 云服务器

蓝易云 - C++中的const成员变量和成员函数

百度搜索:蓝易云

c++ 运维 云服务器 const 服务器租用

开源创新引领未来|酷克数据亮相PostgreSQL中国技术大会,荣获数据库杰出贡献奖

酷克数据HashData

蓝易云 - 如何在云服务器上搭建网站?建站的4大步骤

百度搜索:蓝易云

云计算 运维 云服务器 服务器租用 高防服务器

Dash for Mac(好用的API文档工具)v7.2.4激活版

影影绰绰一往直前

Things3 for Mac 日程和任务管理工具

影影绰绰一往直前

供配电学习笔记 day4

万里无云万里天

自动化 电力 工厂运维

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