C++的哲学思想

💡前言

在很多领域,有些东西是永恒的。而在 C++ 中有下面三条哲学思想便属于这一类:

  1. C++底层不应该基于任何其他语言
  2. 只为使用的东西付费
  3. 以低成本提供高级抽象

向我们的 C++之父 Bjarne Stroustrup 致敬!

Bjarne Stroustrup’s Homepage

在这里插入图片描述

注意:本文并不攻击其他任何语言。

💡C++的哲学思想

☁️C++底层不应该基于任何其他语言

(汇编语言除外)

如果一个语言的目标就是成为正真的高级,那他就必须把做系统程序的设计工作让给其他语言。比如java,python等。这就不得不同时记住两种语言的原语和准则。

C++ 试图给出另一条路,它提供了低级特性和抽象机制,支持这两种东西构造混合的系统。

☁️只为使用的东西付费

(不需要为没有使用到的语言特性付费)

对于规模较大的语言,有一种论断人人皆知,说它们会产生大而慢的结果代码。

如:

由于支持某种特性,使得这个开销遍布于整体,如 java 的很多类型必须开启在堆区,而 C++ 可以自由的在堆或栈创建需要的对象。

还有比如在 C++11 推出的std::thread,没有自动join的机制,在 C++20 推出了std::jthread弥补了这一缺陷。而不是直接在原有的std::thread中修改。因此在以往的代码中,使用者应该清晰的知道自己使用std::thread的代价(如效果,内存大小等),不能因为被后续的规定影响以往的代码。保证十年前的代码,在十年后编译还能表现一致的效果。

这个规则在 C++ 的设计决策中不断成为最关键的考虑。虚函数,多重继承,运行时的类型识别,异常处理和模板,都是与此有关的特性实例。

☁️以低成本提供高级抽象

(更高级的目标是0成本提供高级抽象)

如果像拒绝人们建议一个特性,0开销原则可能是所有规则中最锋利的一个。

但一切都是折中的,这正是设计的美妙所在。

下面是0开销原则的一个经典应用:这是一个时间单位转换问题的小例子。

以第一段代码的风格写更容易出错。

而第二段代码,更抽象,且不会付出格外的代价。两者生成的汇编代码可以达到一致的效果。

struct Duration {
    int millis_;
};

void example() {
    auto d    = Duration{};
    // 毫秒
    d.millis_ = 100;

    // 秒
    auto timeout = 1;
    // 直接将秒在没*1000情况下,直接赋值到毫秒上
    d.millis_    = timeout;
}
#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 低级程序设计支持规则

p117

(C++语言的设计和演化) C++的设计理念-CSDN博客

🌟交流方式

⭐交流方式⭐ |C/C++|算法|设计模式|软件架构-CSDN社区

关注我,学习更多C/C++,python,算法,软件工程,计算机知识

B站:

👨‍💻主页:天赐细莲 bilibili

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐