C++的哲学思想
文章目录
💡前言
在很多领域,有些东西是永恒的。而在 C++ 中有下面三条哲学思想便属于这一类:
- C++底层不应该基于任何其他语言
- 只为使用的东西付费
- 以低成本提供高级抽象
向我们的 C++之父
Bjarne Stroustrup
致敬!
注意:本文并不攻击其他任何语言。
💡C++的哲学思想
☁️C++底层不应该基于任何其他语言
(汇编语言除外)
如果一个语言的目标就是成为正真的高级,那他就必须把做系统程序的设计工作让给其他语言。比如java,python等。这就不得不同时记住两种语言的原语和准则。
C++ 试图给出另一条路,它提供了低级特性和抽象机制,支持这两种东西构造混合的系统。
☁️只为使用的东西付费
(不需要为没有使用到的语言特性付费)
对于规模较大的语言,有一种论断人人皆知,说它们会产生大而慢的结果代码。
如:
由于支持某种特性,使得这个开销遍布于整体,如 java 的很多类型必须开启在堆区,而 C++ 可以自由的在堆或栈创建需要的对象。
还有比如在 C++11 推出的
std::thread
,没有自动join
的机制,在 C++20 推出了std::jthread
弥补了这一缺陷。而不是直接在原有的std::thread
中修改。因此在以往的代码中,使用者应该清晰的知道自己使用std::thread
的代价(如效果,内存大小等),不能因为被后续的规定影响以往的代码。保证十年前的代码,在十年后编译还能表现一致的效果。
这个规则在 C++ 的设计决策中不断成为最关键的考虑。虚函数,多重继承,运行时的类型识别,异常处理和模板,都是与此有关的特性实例。
☁️以低成本提供高级抽象
(更高级的目标是0成本提供高级抽象)
如果像拒绝人们建议一个特性,0开销原则可能是所有规则中最锋利的一个。
但一切都是折中的,这正是设计的美妙所在。
下面是0开销原则的一个经典应用:这是一个时间单位转换问题的小例子。
以第一段代码的风格写更容易出错。
而第二段代码,更抽象,且不会付出格外的代价。两者生成的汇编代码可以达到一致的效果。
cppstruct Duration { int millis_; }; void example() { auto d = Duration{}; // 毫秒 d.millis_ = 100; // 秒 auto timeout = 1; // 直接将秒在没*1000情况下,直接赋值到毫秒上 d.millis_ = timeout; }
cpp#include <chrono> using namespace std::literals::chrono_literals; struct Duration { std::chrono::microseconds millis_; }; void example() { auto d = Duration{}; // 编译错误 // d.millis_ = 100; // 效果一致,且表达更清晰 d.millis_ = 100ms; // 或者写 `std::chrono::seconds(1)` // 但`1s`能更抽象,清晰,简洁 auto timeout = 1s; // 由程序自动帮你做转换 d.millis_ = timeout; }
⭐END
🌟跋
ref:
现代C++软件架构:方法与实践 (豆瓣) (douban.com)
《现代C++软件架构》
1.6 C++的哲学思想
p7
C++语言的设计和演化 (豆瓣) (douban.com)《C++语言的设计和演化》
4.5 低级程序设计支持规则
🌟交流方式
⭐交流方式⭐ |C/C++|算法|设计模式|软件架构-CSDN社区
关注我,学习更多C/C++,python,算法,软件工程,计算机知识
B站:
👨💻主页:天赐细莲 bilibili