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

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.mzph.cn/news/202993.shtml

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

相关文章

网络安全缓冲区溢出实验

实验要求实验步骤函数 f00()函数 f01()函数 f02() 实验要求 C 程序 homework08.c 的主函数如下: int main(int argc, char * argv[]) { init_buf(Lbuffer, LEN);switch(argc) {case 1: f00(); break;case 2: f01(); break;case 3: f02(); break; default: f00(); …

国内AI大模型已近80个,哪个最有前途?

目前,国内已经推出了近80个人工智能大模型,这些大模型各有优势,难以直接判断哪个最有前途。然而,以下几个大模型值得关注: 1、华为云盘古大模型:盘古大模型聚焦于为行业服务,包括自然语言、视觉…

出错:I/O文件读取JAVA

I/O文件读取 /** author:xiaowang* date:2023/12/6* demand:读取java1班的数据* * */ package homework;import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException;public class FileReadTest {public static void main(String[] args) …

月入9K, 95后夫妻转行网优:人生路远,我们只愿携手前行!

用心专注一门课,让教育改变更多人是优橙教育成立的初心与使命。 在优小橙的教育生涯里,见过许多学生,他们或是因为追求一份美好的前程来优橙;或是想要改变泥泞的现状来优橙;或是因为想要深耕通信行业来优橙……理由很多…

Linux--程序地址空间

📘北尘_:个人主页 🌎个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 [TOC](文章目录) 一、程序地址空间回顾 我们在讲C语言的时候,老师给大家画过这样的空间布局…

Qt-Q_OBJECT宏使用与“无法解析的外部符号qt_metacall/metaObject/qt_metacast“

有时候我们编写Qt类的时候,修改代码时直接加上Q_OBJECT宏,然后直接构建,会报如下错误: 这里的几个函数的声明是由Q_OBJECT宏引入的,而其对应的实现是由moc实现的,如果我们更新了代码但是没有执行qmake&…

基于FPGA的图像RGB转CIE-Lab实现,包含testbench和MATLAB辅助验证程序

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1RGB颜色空间 4.2CIE-Lab颜色空间 4.3RGB转CIE-Lab算法原理 5.算法完整程序工程 1.算法运行效果图预览 将FPGA的结果导入到matlab,并和matlab的仿真结果进行对比&#xff1a…

使用TouchSocket适配一个c++的自定义协议

这里写目录标题 说明一、新建项目二、创建适配器三、创建服务器和客户端3.1 服务器3.2 客户端3.3 客户端发送3.4 客户端接收3.5 服务器接收与发送 四、关于同步Send 说明 今天有小伙伴咨询我,他和同事(c端)协商了一个协议,如果使…

【Hadoop_01】Hadoop介绍与安装

1、Hadoop、HDFS、YARN介绍(1)Hadoop简介与优势(2)Hadoop组成(3)HDFS概述(4)YARN概述(5)MapReduce概述 2、安装(1)Centos7.5软硬件安装…

基于jsp+servlet+mybatis的简易在线选课系统

目录 一.数据库 1.数据库和表的创建 2.数据插入 二.代码实现 1.pojo类 (1)Course (2)User (3)Elective 2.mapper接口 (1)UserMapper (2)ElectiveMap…

vs 安装 qt qt扩展 改迅雷下载qt

Qt5.14.2安装教程和VS2019中的qt环境配置-CSDN博客 1 安装qt 社区版 免费 Download Qt OSS: Get Qt Online Installer 2 vs安装 qt vs tools 3 vs添加 qt添加 bin/cmake.exe 路径 3.1 扩展 -> qt versions 3.2 4 新版要源码安装 需要自己安装 安装独立安装的旧版 官网…

D. Jumping Through Segments

显然是一个二分答案,关键是怎么搞判断函数? 我们维护合法的降落区间就好了~ // Problem: D. Jumping Through Segments // Contest: Codeforces - Codeforces Round 913 (Div. 3) // URL: https://codeforces.com/contest/1907/problem/D // Memory Li…

car relative position

如何判断你驾驶的车在路上是否居中 车辆相对位置判断,参考 右侧和路边线交点 看右后视镜,看下大概和边线相差多少

SQL手工注入漏洞测试(Sql Server数据库)-墨者

———靶场专栏——— 声明:文章由作者weoptions学习或练习过程中的步骤及思路,非正式答案,仅供学习和参考。 靶场背景: 来源: 墨者学院 简介: 安全工程师"墨者"最近在练习SQL手工注入漏洞&#…

详解nginx优势以及应用场景,实操编译安装和nginx版本平滑升级

目录 一、nginx的特点 那么nginx有哪些特点? 先讲nginx的优点: 缺点: 二、nginx与Apache的区别 三、nginx的应用场景 四、nginx为什么能支持高并发 五、为什么nginx不使用多线程 六、nginx的两种进程分别有什么作用 七、编译安装ngi…

二叉搜索树——模拟

对于一个无穷的满二叉排序树(如图),节点的编号是1,2,3,…。对于一棵树根为X的子树,沿着左节点一直往下到最后一层,可以获得该子树编号最小的节点;沿着右节点一直往下到最后一层,可以…

【办公软件】Win10/Win11复制粘贴必须刷新才能显示

更换了新的一台电脑,但是发现新建文件夹或是复制粘贴文件时,不管是在桌面还是在其他磁盘中都需要右击刷新一下才显示。让人很郁闷,比如新建一个文件夹不显示以为没有新建成功,导致重复建了好几个。 如何解决? 使用Wi…

一步解决 java.io.FileNotFoundException: 找不到文件异常

1.问题描述 java.io.FileNotFoundException: C:\Users\Administrator\AppData\Local\Temp\localhost\uploads\image\20231206\2843cb16-9654-4e52-a757-76e3ca1f80ff.png (系统找不到指定的路径。) 2.原因分析 文件路径中的文件目录不存在 3.解决方案 方案一:如果…

行业研究:2023年中国游戏陪玩行业市场现状分析

近年来随着我国游戏行业的不断发展,我国游戏用户规模也是随着稳步上升,给游戏陪玩行业带来了稳定的用户基础。在用户规模增长的同时,随着经济、文化的快速发展,我国娱乐技能社交也随之逐渐兴起。而作为我国娱乐技能社交比重较大的…