总结一下如何写出更好的 C++ 代码?
最近突然想来写一些 CSDN 的文章,和大家分享一些我的理解。
算是抛砖引玉,斗胆找了一个比较有趣的话题:
下面是一些可供理解的角度(不分先后):
1. [General] 更好的使用抽象
在开始书写代码前要反复考虑功能之间的关系,将一部分功能独立成一个组合,并考虑清楚其他功能如何使用这个组合,以及可能出现的边界情况。这些都是我们清晰定义代码的重要手段。
2. [General] 清晰的解构代码
如何将代码拆开,并且让外部可以接触一部分代码内部的入口减少(减少暴露给外部的函数或成员、方法)对于将代码问题缩小十分有用。50行代码有问题总比1000行代码有问题要好解决的多。
3. [General] 让测试如影随形
测试在开发过程中的重要性不需赘述,但更加重要的一点我们要认识到 测试是提高开发效率的重要手段。测试可以为我们节省大量的调试、差错的时间。更快速、更便捷的进行测试是十分重要的。最好是能够修改1行代码,就可以快速地重新测试,这样我们才可以快速的发现错误,调整方案,重新设计而不必瞻前顾后。
测试需要不断更新,在快速测试中有选择地进行测试,对一些稳定代码的测试逐渐减少其出现次数。
4. [General] 考虑更优的方案
在有必要的情况下选择更优的方案,避免堆积技术债务。
5. [General] 清晰简洁的代码注释,美观的规范
写代码要让自己赏心悦目,总是一件幸事。
技术角度考虑:
1. [Memory] 更好的内存管理
减少频繁 malloc / free 的次数,频繁的 malloc / free 总会产生性能开销,能够减少这种操作通常意味着代码的内存管理或利用会更加有效。特别是对于长度不变的内存空间,复用内存空间是一种更好的解决方案(前提是需要清晰地考虑这个内存空间的生命周期)。
2. [CPU Load] 提高有效指令率
在书写代码时,我们往往会看到很多的 C++ 函数被执行后的结果被丢弃掉了或者赋给了一个永不会被读取的变量,那么这个函数过程执行结果就是 (unused-variable) 或者叫 dead variable, 这样的变量会影响整体计算的效率,特别是对CPU耗时长的应用场景更是要命。
这一点在很多时候是难以发现的,譬如有些 for 循环内部的循环变量是否在不必要时可以省去?某些判断条件能否从 if ... else if 转为 if ... else ... 在正确处理逻辑的前提下,这些改进可以进一步提升整体的代码质量。这就要求我们不断审视常见的思维定式,并参考他人的实践。考虑是否有更佳方案。
3. [CPU Load] 在合适的情况下,将数据聚合在一起
连续的数据存储往往比分散的数据会更有计算上的优势,这就体现在(连续的一组数值)和(连续的一组结构以及每个结构内的一个数值)这两种模式相比,前者更有优势。这种优势往往是不直观的,但是却十分有效。
4. [Logics] 面向并行、分布式设计
让单个函数、过程可以支持多核并行处理,分布式运行,往往意味着后期的架构设计会更加轻松。