关于程序员:C最佳实践-5-可移植性及多线程

7次阅读

共计 1203 个字符,预计需要花费 4 分钟才能阅读完成。

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

可移植性

明确应用的类型

大多数产生告警的可移植性问题都是因为咱们没有留神类型。规范库和数组应用 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 就是对于从动静模块加载的共享静态数据的销毁程序的。

共享指针

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

也能够参考后面对于 const & 返回值安全性的探讨。

你好,我是俞凡,在 Motorola 做过研发,当初在 Mavenir 做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI 等技术始终保持着浓重的趣味,平时喜爱浏览、思考,置信继续学习、一生成长,欢送一起交流学习。\
微信公众号:DeepNoMind

本文由 mdnice 多平台公布

正文完
 0