当前位置: 首页 > news >正文

C++的哲学思想

C++的哲学思想

文章目录

  • C++的哲学思想
  • 💡前言
  • 💡C++的哲学思想
    • ☁️C++底层不应该基于任何其他语言
    • (汇编语言除外)
    • ☁️只为使用的东西付费
    • (不需要为没有使用到的语言特性付费)
    • ☁️以低成本提供高级抽象
    • (更高级的目标是0成本提供高级抽象)
  • ⭐END
    • 🌟跋
    • 🌟交流方式

💡前言

在很多领域,有些东西是永恒的。而在 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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Rust 文件与 IO
  • 2.gitlab ce 细粒度的权限控制
  • SQL查询中的数据处理:利用IFNULL处理NULL值
  • 9月23日
  • 大厂面试真题:SpringBoot的核心注解
  • 微软推迟在MDM设备上启用OOBE强制更新 因为IT管理员反馈称缺乏控制
  • 交易验证码识别数据集
  • Python:百度贴吧实现自动化签到
  • 人工智能课程实训方案
  • Vue3(二)计算属性Computed,监视属性watch,watchEffect,标签的ref属性,propos属性,生命周期,自定义hook
  • html+css(如何用css做出京东页面,静态版)
  • Directives Vue3 自定义指令
  • 由于安全风险,安全领导者考虑禁止人工智能编码
  • 【html】基础(一)
  • SQLServer数据分页
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • HashMap ConcurrentHashMap
  • Hibernate【inverse和cascade属性】知识要点
  • nodejs实现webservice问题总结
  • Python_网络编程
  • Python进阶细节
  • ReactNative开发常用的三方模块
  • Selenium实战教程系列(二)---元素定位
  • springboot_database项目介绍
  • 从setTimeout-setInterval看JS线程
  • 技术发展面试
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 什么软件可以剪辑音乐?
  • 使用Gradle第一次构建Java程序
  • 组复制官方翻译九、Group Replication Technical Details
  • ​Python 3 新特性:类型注解
  • ​zookeeper集群配置与启动
  • ​业务双活的数据切换思路设计(下)
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • (1)Android开发优化---------UI优化
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (3)医疗图像处理:MRI磁共振成像-快速采集--(杨正汉)
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (回溯) LeetCode 40. 组合总和II
  • (五)MySQL的备份及恢复
  • (原)Matlab的svmtrain和svmclassify
  • (转) Android中ViewStub组件使用
  • (转) RFS+AutoItLibrary测试web对话框
  • (转)Scala的“=”符号简介
  • (转)负载均衡,回话保持,cookie
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • .JPG图片,各种压缩率下的文件尺寸
  • .net wcf memory gates checking failed
  • .net6+aspose.words导出word并转pdf
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • .NET企业级应用架构设计系列之应用服务器
  • .pop ----remove 删除
  • /bin/bash^M: bad interpreter: No such file or directory
  • /boot 内存空间不够