本系列是开源书C++ Best Practises[1]的中文版,全书从工具、代码风格、安全性、可维护性、可移植性、多线程、性能、正确性等角度全面介绍了现代C++项目的最佳实践。本文是该系列的第五篇。

C++最佳实践:

1. 工具

2. 代码风格

3. 安全性

4. 可维护性

5. 可移植性及多线程(本文)

6. 性能

7. 正确性和脚本

可移植性

明确使用的类型

大多数产生告警的可移植性问题都是因为我们没有注意类型。标准库和数组使用size_t作为索引,标准容器的大小使用size_t类型。如果对size_t的处理不正确,可能会潜伏有微妙的64位问题,这种问题只有在开始32位整型索引溢出之后才会出现。另一种类似问题是char类型和unsigned char类型的使用。

参考: http://www.viva64.com/en/a/0010/

使用标准库

std::filesystem

C++17新增了新的filesystem库,在所有支持的编译器上提供了可移植的文件系统访问能力。

std::thread

C++11的线程功能能够基于pthreadWinThreads使用。

其他

本系列中的其他大多数问题最终都可以归结到可移植性上,尤其要注意避免静态(static)类型(参考下文多线程部分)。

多线程

避免全局数据

全局数据会导致函数之间意想不到的副作用,并可能使代码难以甚至无法并行化。即使现在的代码不是为了并行化而写,也没有理由在将来永远不做并行化。

静态(static)数据

除了作为全局数据之外,静态数据并不总是像期望的那样被构造和析构,在跨平台环境中尤其如此。例如,有个g++的bug[2]就是关于从动态模块加载的共享静态数据的销毁顺序的。

共享指针

std::shared_ptr和全局变量一样(http://stackoverflow.com/a/18803611/29975),允许多段代码与相同的数据交互。

单例(Singleton)

单例通常使用静态和/或shared_ptr实现。

避免堆操作

堆操作在多线程环境中要慢得多,在许多甚至大多数情况下,复制数据会更快,更别提还有move操作这之类的东西。

互斥对象(mutex)和可变对象(mutable)一起使用(M&M规则,C++11)

对于成员变量,最好同时使用互斥锁和可变变量,这在两方面都适用:

  • 可变成员变量被假定为共享变量,因此应该与互斥锁同步(或原子化)。

  • 如果一个成员变量本身是互斥的,那么应该是可变的,这是在const成员函数中使用它所必需的。

更多信息请参阅Herb Sutter的文章: GotW #6a Solution: Const-Correctness, Part 1[3]

也可以参考前面关于const &返回值安全性[4]的讨论。

微信公众号:DeepNoMind

参考资料

[1]

C++ Best Practises: https://lefticus.gitbooks.io/cpp-best-practices/content/

[2]

Problem with C++ unique symbols in plugins: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66830

[3]

GotW #6a Solution: Const-Correctness, Part 1: http://herbsutter.com/2013/05/24/gotw-6a-const-correctness-part-1-3/

[4]

C++最佳实践之安全性: https://www.mdnice.com/writing/210940dd994a4b76930359652864bca3

- END -

点击阅读原文加入知识星球

C++最佳实践 | 5. 可移植性及多线程相关推荐

  1. 多线程高并发 底层锁机制与优化的最佳实践——各种锁的分类 || synchronized 关键字 倒底锁的是什么东西?|| CAS与ABA问题||锁优化||轻量级锁一定比重量级锁的性能高吗

    多线程高并发 底层锁机制与优化的最佳实践 各种锁的分类 加上synchronized 关键字,共享资源就不会出错 synchronized 关键字 倒底锁的是什么东西? synchronized 锁的 ...

  2. dateformat线程_Java最佳实践–多线程环境中的DateFormat

    dateformat线程 这是有关使用Java编程语言时的拟议实践的系列文章的第一篇. 所有讨论的主题均基于用例,这些用例源于电信行业关键任务超高性能生产系统的开发. 在阅读本文的每个部分之前,强烈建 ...

  3. Java最佳实践–多线程环境中的DateFormat

    这是有关使用Java编程语言时的拟议实践的系列文章的第一篇. 所有讨论的主题均基于用例,这些用例来自于电信行业的关键任务超高性能生产系统的开发. 在阅读本文的每个部分之前,强烈建议您参考相关的Java ...

  4. C++最佳实践 | 1. 工具

    本系列是开源书C++ Best Practises[1]的中文版,全书从工具.代码风格.安全性.可维护性.可移植性.多线程.性能.正确性等角度全面介绍了现代C++项目的最佳实践.本文是该系列的第一篇. ...

  5. 深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)读书笔记

    前言 我在读 深入理解java虚拟机 这本书,把整体其中的关键点标记了,希望自己对它有个不一样的理解,也希望大家能看看这本写的很好的书 深入理解Java虚拟机:JVM高级特性与最佳实践(第3版) pd ...

  6. Java 设计模式最佳实践:1~5

    原文:Design Patterns and Best Practices in Java 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自[ApacheCN Java 译文集],采用译后编 ...

  7. 使用ADO.NET 的最佳实践(zz)

    数据访问:使用 ADO.NET 的最佳实践(ADO.NET 技术文档) 发布日期: 4/1/2004 | 更新日期: 4/1/2004 摘要:编写 Microsoft ADO.NET 代码的最佳实践, ...

  8. Spring Batch在大型企业中的最佳实践

    在大型企业中,由于业务复杂.数据量大.数据格式不同.数据交互格式繁杂,并非所有的操作都能通过交互界面进行处理.而有一些操作需要定期读取大批量的数据,然后进行一系列的后续处理.这样的过程就是" ...

  9. RESTful服务最佳实践

    本文主要读者 引言 REST是什么 统一接口 基于资源 通过表征来操作资源 自描述的信息 超媒体即应用状态引擎(HATEOAS) 无状态 可缓存 C-S架构 分层系统 按需编码(可选) REST快速提 ...

最新文章

  1. xwpftemplate的时间设置_java poi设置生成的word的图片为上下型环绕以及其位置
  2. Python Module_openpyxl_处理Excel表格
  3. 不知道被谁删了微信好友?用 Python 来帮忙呀
  4. 1、MySQL性能优化简述
  5. sonar 分析的质量数据在数据库表中的存储和质量维度数值的研究
  6. scATAC-seq建库原理,质控方法和新R包Signac的使用
  7. 【生活资讯】5款好用的生活学习类APP
  8. shareSDK 提示#warning:尚未配置[新浪微博]URL Scheme:sinaweibosso.或wb
  9. 127.0.0.1和0.0.0.0和本机IP的区别
  10. android 4.2 camera gallery2,Android Gallery2 修改双击、手势放大的最大倍数
  11. code review的一些思考
  12. 什么是SIT测试,、UAT测试?
  13. 两化融合管理体系评定申请表概况
  14. VMware12安装centOS8(vm虚拟机安装centos8教程)
  15. python爬虫-国家企业_国家企业信用公示系统的爬取
  16. nginx 三级域名泛解析并指向某文件 带参数
  17. 微信公众号(订阅号)文章阅读数监控V0.1
  18. 我把电脑系统升级成Windows11,体验了一下还是换回Windows10
  19. linux vi 编辑器下经常会用到保存退出与不保存退出
  20. 笔记本计算机声卡开关,笔记本电脑没声音了怎么回事

热门文章

  1. 国企数字化转型主要工作
  2. 什么是进程、进程的概念?
  3. 知乎日报APP:API接口分析
  4. Asc、AscB、AscW
  5. C专家编程--随记(一)
  6. 离线下载Android SDK(100%成功)
  7. vi新建一个shell脚本_编写第一个Shell脚本
  8. 云中漫步-但是还有书籍
  9. C# .NET实现手机接收短信
  10. C/C++语言重要语法之输入输出