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 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python函数

1.函数 1.1 函数概述 函数定义和优势 不同形状正方形打印 # 2个 for i in range(0, 2):for j in range(0, 2):print("*", end"")print() # 3个 for i in range(0, 3):for j in range(0, 3):print("*", end"")print() # 4个 for i …

NET Core迁移前工作

前段时间迁移.NET Core做了大量的试水和评估,今天整理一下分享给大家。大致有以下几个部分: 1. .NET Core的由来 2. 为什么要迁移.NET Core 3. .NET Core3.X主要特性 4. .NET Standard和.NET Core 5. .NET Core Roadmap&版本选择 接下来&#…

记录一次vscode markdown的图片路径相关插件学习配置过程

插件及说明查找过程 csdn搜索markdown图片路径,找到关于这一款插件的回答。打开vscode拓展搜索Paste Image这款插件,看到下载量挺高的,应该不赖。 点击仓库,进入该插件开源的github仓库,查看README文件阅读说明. 淡然在Vscode 插件项目下的细…

minio的k8s的单机部署

minio的k8s的单机部署 apiVersion: apps/v1 kind: Deployment metadata:name: minionamespace: itshare spec:replicas: 1selector:matchLabels:app: miniotemplate:metadata:labels:app: miniospec:containers:- name: minioimage: minio/minio:RELEASE.2022-10-15T19-57-03Z…

微服务开发:断路器详解

微服务是目前业界使用的最重要的实现方面。通过使用微服务架构,开发人员可以消除他们以前在单体应用程序中遇到的许多问题。展望未来,人们开始在微服务中搜索和采用各种模式。大多数时候,新模式的产生是为了解决另一个模式中出现的常见问题。…

MySQL Server 层和引擎层是如何交互的

Server 层、引擎层、BufferPool、磁盘间的关系 大体来说, MySQL可以分为Server层和存储引擎层两部分。 1)Server 层:Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖MySQL的大多数核心服务功能,以及所…

深信服行为管理AC设置禁止用户使用向日葵等远程软件

需求:在特定的时间内禁止内外网用户使用向日葵、todesk等远程软件;只禁止使用专业的远程软件,内网的ssh、telnet、RDP需要正常放行 AC版本:AC13.0.62.001 Build20221107 通过访问权限策略来控制 1、行为管理→访问权限策略→新…

基于springboot+vue篮球联盟管理系统源码

🍅 简介:500精品计算机源码学习 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 文末获取源码 目录 一、以下学习内容欢迎交流: 二、文档资料截图: 三、项目技术栈 四、项目运行图 背景: 篮球运…

「智慧城市」这一概念科学吗?还是炒作?

智慧城市是一个综合性的概念,它利用信息技术和创新概念,将城市的各个系统和服务集成起来,以提升城市运行效率、优化城市管理和服务,改善市民的生活质量。 具体来说,智慧城市涵盖了许多领域,包括城市规划、建…

【408】计算机学科专业基础 - 计算机组成原理

一、计算机系统概述 【复习提示】 本章是组成原理的概述,考查时易针对有关概念或性能指标出选择题,也可能综合后续章节的内容出有关性能分析的综合题。掌握本章的基本概念,是学好后续章节的基础。部分知识点在初学时理解不深刻也无须担忧&am…

uni-app中vue3表单校验失败

目录 1.问题 2.原因及解决方式 3.表单校验方式&#xff08;vue3&#xff09; 1.问题 在app中使用uni-forms表单&#xff0c;并添加校验规则&#xff0c;问题是即使输入内容&#xff0c;表单校验依然失败。 代码&#xff1a; <template><view><uni-forms r…

案例052:用于日语词汇学习的微信小程序

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

Nginx跨域配置

一 跨域概述 1.1 同源策略 同源策略是一个安全策略。同源&#xff0c;指的是协议&#xff0c;域名&#xff0c;端口相同。浏览器处于安全方面的考虑&#xff0c;只允许本域名下的接口交互&#xff0c;不同源的客户端脚本&#xff0c;在没有明确授权的情况下&#xff0c;不能读…

【SVM】不同数据划分方式导致结果不同...

此帖是一个自我纠查帖&#xff0c;感觉基本不会有其他人踩相同的坑。 背景&#xff1a;在MI分类中使用FBCSPSVM&#xff0c;基于这个方法写了两个分类的.py文件实现&#xff0c;在数据划分上大差不差&#xff08;都是CV5&#xff09;&#xff0c;但是结果却相差很多 方法一&a…

自定义数组,循环展示对象数据,vue3监视数组

HTML <div v-for"(item, index) in dataList" :key"index"> <span>{{ item.title }}:</span> <span>{{ dataInfo[item.content] }}</span> </div> JS 需要展示的键值对放入数组中 let dataList [ { title: data1, co…

慎用!3个容易被打的Python恶搞脚本

Python 无限恶搞朋友电脑&#xff0c;别提有多爽了&#xff0c;哈哈&#xff0c;打造自己的壁纸修改器&#xff0c;电脑无限锁屏&#xff0c; 无线弹窗&#xff0c;都在这里&#xff01;&#xff01;&#xff01; 1、修改电脑桌面壁纸 工具使用 开发环境&#xff1a;python3…

Python替代Adobe从PDF提取数据

大家好&#xff0c;PDF文件是官方报告、发票和数据表的通用格式&#xff0c;然而从PDF文件中提取表格数据是一项挑战。尽管Adobe Acrobat等工具提供了解决方案&#xff0c;但它们并不总是易于获取或可自动化运行&#xff0c;而Python则是编程语言中的瑞士军刀。本文将探讨如何利…

有线传输介质

目录 1、双绞线 &#xff08;1&#xff09;无屏蔽双绞线 UTP(Unshielded Twisted Pair) &#xff08;2&#xff09;屏蔽双绞线 STP (Shielded Twisted Pair) &#xff08;3&#xff09;布线标准EIA/TIA-568-&#xff21; &#xff08;4&#xff09;双绞线的特点 2、同轴电…

Java异常讲解

&#x1f435;本篇文章将对异常相关知识进行讲解 一、异常的结构 在程序执行的过程中出现的一些问题叫做异常&#xff0c;异常其实是一个一个类&#xff0c;每一种异常都代表一个类 1.1 几种常见的异常 System.out.println(10/0); //算数异常 //Exception in thread "m…