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

2023-12-06 23:52

本文主要是介绍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 

这篇关于C++ Core Guidelines解析 ( 好书推荐 )的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Mysql中设计数据表的过程解析

《Mysql中设计数据表的过程解析》数据库约束通过NOTNULL、UNIQUE、DEFAULT、主键和外键等规则保障数据完整性,自动校验数据,减少人工错误,提升数据一致性和业务逻辑严谨性,本文介绍My... 目录1.引言2.NOT NULL——制定某列不可以存储NULL值2.UNIQUE——保证某一列的每一

C++11范围for初始化列表auto decltype详解

《C++11范围for初始化列表autodecltype详解》C++11引入auto类型推导、decltype类型推断、统一列表初始化、范围for循环及智能指针,提升代码简洁性、类型安全与资源管理效... 目录C++11新特性1. 自动类型推导auto1.1 基本语法2. decltype3. 列表初始化3

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

MySQL CTE (Common Table Expressions)示例全解析

《MySQLCTE(CommonTableExpressions)示例全解析》MySQL8.0引入CTE,支持递归查询,可创建临时命名结果集,提升复杂查询的可读性与维护性,适用于层次结构数据处... 目录基本语法CTE 主要特点非递归 CTE简单 CTE 示例多 CTE 示例递归 CTE基本递归 CTE 结

C++中detach的作用、使用场景及注意事项

《C++中detach的作用、使用场景及注意事项》关于C++中的detach,它主要涉及多线程编程中的线程管理,理解detach的作用、使用场景以及注意事项,对于写出高效、安全的多线程程序至关重要,下... 目录一、什么是join()?它的作用是什么?类比一下:二、join()的作用总结三、join()怎么

Spring Boot 3.x 中 WebClient 示例详解析

《SpringBoot3.x中WebClient示例详解析》SpringBoot3.x中WebClient是响应式HTTP客户端,替代RestTemplate,支持异步非阻塞请求,涵盖GET... 目录Spring Boot 3.x 中 WebClient 全面详解及示例1. WebClient 简介2.

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

C#解析JSON数据全攻略指南

《C#解析JSON数据全攻略指南》这篇文章主要为大家详细介绍了使用C#解析JSON数据全攻略指南,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、为什么jsON是C#开发必修课?二、四步搞定网络JSON数据1. 获取数据 - HttpClient最佳实践2. 动态解析 - 快速

Spring Boot3.0新特性全面解析与应用实战

《SpringBoot3.0新特性全面解析与应用实战》SpringBoot3.0作为Spring生态系统的一个重要里程碑,带来了众多令人兴奋的新特性和改进,本文将深入解析SpringBoot3.0的... 目录核心变化概览Java版本要求提升迁移至Jakarta EE重要新特性详解1. Native Ima