C++的哲学思想

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开销原则的一个经典应用:这是一个时间单位转换问题的小例子。

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

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

cpp 复制代码
struct 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 低级程序设计支持规则

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

🌟交流方式

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

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

B站:

👨‍💻主页:天赐细莲 bilibili

相关推荐
阑梦清川6 分钟前
JavaEE进阶---第一个SprintBoot项目创建过程&&&我的感受
java·java-ee·springboot
程序员清风11 分钟前
浅析Web实时通信技术!
java·后端·面试
好想有猫猫15 分钟前
【51单片机】串口通信原理 + 使用
c语言·单片机·嵌入式硬件·51单片机·1024程序员节
wyh要好好学习18 分钟前
SSM— spring,springMVC,mybatis整合
java·spring
2401_8582861119 分钟前
C6.【C++ Cont】cout的格式输出
开发语言·c++
小袁在上班19 分钟前
Python 单元测试中的 Mocking 与 Stubbing:提高测试效率的关键技术
python·单元测试·log4j
白狐欧莱雅21 分钟前
使用python中的pygame简单实现飞机大战游戏
经验分享·python·游戏·pygame
忘梓.22 分钟前
排序的秘密(1)——排序简介以及插入排序
数据结构·c++·算法·排序算法
阿_旭23 分钟前
基于YOLO11/v10/v8/v5深度学习的维修工具检测识别系统设计与实现【python源码+Pyqt5界面+数据集+训练代码】
人工智能·python·深度学习·qt·ai
阿_旭27 分钟前
基于YOLO11/v10/v8/v5深度学习的煤矿传送带异物检测系统设计与实现【python源码+Pyqt5界面+数据集+训练代码】
人工智能·python·深度学习·目标检测·yolo11