问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

C++之父的"洋葱原则":如何平衡抽象与性能

创作时间:
作者:
@小白创作中心

C++之父的"洋葱原则":如何平衡抽象与性能

引用
CSDN
1.
https://m.blog.csdn.net/CUBE_lotus/article/details/144763563

"洋葱原则"是C++之父Bjarne Stroustrup提出的一种编程理念,强调在解决问题时应该优先使用高级抽象机制,只有在必要时才深入到更低层次的细节。这种原则不仅适用于C++编程,也适用于其他领域的软件开发。

原话

“如果要完成的任务是简单的,那就用简单的方法做;当要完成的任务不是那么简单时,就需要更详细、更复杂的技巧或写法。这就好比你剥下了一层洋葱。剥得越深,流泪就越多。”

性能与抽象的关系

在C++中,我们希望实现多个目标:初学者友好、向后兼容性、高性能和丰富的抽象功能。这些目标之间存在矛盾,不可能同时完美实现。Stroustrup建议使用"洋葱原则"来平衡这些目标。

抽象层次就像一个洋葱,是层层嵌套的。在解决问题时,只要可能,就应该使用尽可能高级的抽象机制,利用比较简单的方式来解决问题。只有在因为性能之类的原因需要进一步优化时,才应该使用C++提供的高级功能,在使用抽象机制的同时,进行项目相关的特殊定制。

调优:“洋葱原则”

Stroustrup强调,在优化代码时,重要的是要在优化前后都进行性能测量,同时在设计接口时就要考虑优化空间。他提出了几个关键原则:

  1. 接口设计需明确定义
  2. 保持类型信息的完整性
  3. 提供足够信息支持检查和优化
  4. 管理复杂度:“简单的事情简单做!”

"我把这个叫做 '洋葱原则'," Stroustrup打了个生动的比方,"你可以把代码想象成洋葱的层。每当我们需要优化或处理特殊情况,我们就可能需要剥掉一层抽象。但要记住,每剥掉一层,你就会哭得更厉害。"

"为什么会这样?"他继续解释道,"因为每深入一层,你就有可能遇到更多的错误,必须写更多的代码,代码也更难理解。所以在真正需要之前,不要轻易剥掉一层抽象。这就是我对 '不要过早优化' 的理解。"

核心

"洋葱原则"的核心类似于KISS原则(Keep It Simple Stupid)。设计原则包括:

  1. 保持简单
  2. 抽象是有代价的

这两点考验编程人员的功底,需要对使用技术有深入了解和极简应用的能力。对事物抽象性质的分析和总结,抽象层次越深,所对应的代价越大。洋葱剥得越多,哭得越厉害。

C++不是一味地推崇"0开销原则",因为不可能所有东西都不付出代价,比如虚函数、运行时类型识别等等。中庸点来讲是低成本实现高级抽象。

在学习C++时,不应该从那些琐碎易错的细节学起,自底向上。相反,学习应当自顶向下,先学习高层的抽象,再层层剥茧、丝丝入扣地一步步进入下层。如果一次走太深的话,挫折可能就难免了。

而对于调优,这其实是一个大话题。先保证一个能跑原则,不要过早的优化。阿姆达尔定律(Amdahl's Law)可以当作是整体复杂度和模块优化程度对软件整体的影响程度。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号