共计 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 的线程性能可能基于 pthread
或WinThreads
应用。
其余
本系列中的其余大多数问题最终都能够归结到可移植性上,尤其要留神防止动态 (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 多平台公布