carcard_3- c++的优势和现状以及未来发展(明白为什么用cpp)

article/2024/4/20 14:18:26

文章目录

  • init
    • summary
    • 适用领域
      • 优劣点
      • C++ 语言认知
      • 各种语言底层的理解
      • 可以从事的岗位和要求的技术栈
      • 过去,现在和未来的发展趋势

init

summary

主要是对比了各种其他语言,明确了C++在编译器上和底层内存模型的优势上建立了高性能低延时领域的绝对优势,但是在底层和类设计上没有太多抽象的能力,因此太灵活的表达和高级的封装工作量太大。而这些高性能领域其实各自领域非常分散,无法通用。此外要知道C++在自身性能没问题和cpu计算性能没法增加的环境下,继续向语法简洁,项目容易管理的方向上去走,同时加入现在其他语言在用的优秀东西,例如Coroutines等。 复杂计算要么用cpp要么下放到其他硬件上。

适用领域

关注于高性能或者底层领域, 而不是业务领域, 业务领域有点像用汽车穿过小巷, 浪费时间还效率低。

  • 因为C++在运行的时候是直接编译成二进制机器代码的, 虽然有些东西是要运行中决定, 例如函数的创建, 但是本身运行速度就很快, 不像java和python等语言需要额外一些工具帮你翻译成机器代码。 虽然python那些不用管理内存的语言开发速度很快, 但是内存垃圾回收容易导致突然变慢, 这在游戏等高性能领域是不被允许的, 你卡了别人不卡直接把你杀了, 电商搜索业务员你卡了或者慢了别人就换app搜了, 而下单业务等可以慢一点,因为已经决定好买了, 愿意花这点时间。 如果不那么在乎性能开销,那么 C++ 并不是最好的语言选择(Java、Go、Python 等正是填补了这些领域);或者软件规模不大、无需很多抽象手段来管理软件的复杂度,那么 C 语言就足够。但如果性能是软件的关键指标,同时又有越来越大的复杂度,那么 C++ 几乎是独一无二的选择。我们看到 C++ 这些年来的发展,都是紧扣 40 年前 Bjarne 为 C++ 设定的“生态位”与“核心精神”而开展的。

优劣点

优点与通用行业领域知识绑定多,没35岁危机, 入门难, 壁垒高。 缺点就是生态太少了, 如果做业务效率太低, 各个C++领域生殖隔离。

  • 行业壁垒 : C++很难, 容易形成技术壁垒。 因为没有方便的库, 新手和很多浮躁的人不会进来, 而现在年轻人进来少, 因此值得学习。 C++ 语言本身一直在发展, 而且他有右值引用等等极其优化性能的设计, 不像python java等只有官方规定的规则, 不能极致优化。 C++的性能是go的5倍, 在并发、网络、模板等方面具有先天优势。 但是如果是界面开发或者客户端等不是高性能的地方, C++并不占优势。学到后期要去改源码, 裁剪源码, 形成自己的知识体系。 而且不同领域的C++开发认识的C++完全不一样, 写嵌入式的C++程序员对C++理解难以提升。 写视觉和音视频的话很多也都是c with class。 很多时候你会发现没有统一的库, 反而是好事, 将开发能力给了开发人员。 越是底层人员有占比能力的领域, 越不容易被资本收割, 例如嵌入式和互联网。
  • 语言本身第三方库比较乱,感觉啥都做不了。 *C/C++ 整套的语法不具备“功能完备性”,单纯地使用这门语言本身提供的功能无法创建任何有意义的程序,必须借助操作系统的 API 接口函数来达到相应的功能。 **当然,随着 C++ 语言标准和版本的不断更新升级,这种现状正在改变;而像 Java、Python 这类语言,其自带的 SDK 提供了各种操作系统的功能。举个例子,C/C++ 语言本身不具备网络通信功能,必须使用操作系统提供的网络通信函数(#include<system/socket>如 Socket 系列函数);而对于 Java 来说,其 JDK 自带的 java.net 和 java.io 等包则提供了完整的网络通信功能。我在读书的时候常常听人说,QQ、360 安全卫士这类软件是用 C/C++ 开发的,但是当我学完整本 C/C++ 教材以后,仍然写不出来一个像样的窗口程序。许多过来人应该都有类似的困惑吧?其原因是一般 C/C++ 的教材不会教你如何使用操作系统 API 函数的内容。**C/C++ 语言需要直接使用操作系统的接口功能,这就造成了 C/C++ 语言繁、难的地方。**如操作内存不当容易引起程序宕机,不同操作系统的 API 接口使用习惯和风格也不一样。接口函数种类繁多,开发者如果想开发跨平台的程序,必须要学习多个平台的接口函数和对应的系统原理。Java 这类语言,很多功能即使操作系统提供了,如果 Java 虚拟机不提供,开发人员也无法使用。
  • C++本身因为历史包袱的原因, 在新的版本中一直在优化之前的东西。
  • 之前看了一个视频, 讲了很多C语言底层的东西, 从这里可以看出来,这种语言根本不适合上层开发,要程序员考虑的东西太多了,一点也不友好, 用这个语言做业务开发太慢了。精力全花在轮子上, 业务一点也没做。
  • java关注易用性, C++关注性能, 易用性和性能难以同时追求最优。
  • 生态差, 导致大佬在新手阶段都去搞java了。

C++ 语言认知

C++的特点

  • 控制硬件, 控制生命周期, zero抽象。 支持三种编程方式, 并且一直会改进。 不用自己额外开线程做垃圾回收, 大部分简单变量可以搞成栈上的数据,相比较堆数据汇编语句更少, 可以在编译期花时间进行优化提升运行效率。
  • C++比java快除了内存模型,更重要的是C++的自己管理数据创建,java是堆上,这是不连续的,cpu的cache频繁无法命中,这是最关键的。

C++重要的是不要迷失方向

  • C++本身支持面向对象、 面向过程, 函数编程, 模板编程, 模板元编程, 因此包含的太多了, 需要我们自己把我好度, 只用自己应该用的, 不要炫技。

各种语言底层的理解

  1. 各种高级语言是怎么转换成汇编让电脑执行的? ref高级语言如何转汇编语言的问题?–菜梦的回答一知乎 和高级语言到汇编的过程主要就是将自己的语法解析成语法树,然后合并成为最终的语法表达数,然后对里面的各个节点进行符号表分配相对地址,然后链接库,最后在运行阶段搞成绝对地址。
  2. 怎么理解各种各样的编程语言,为什么由这么多编程语言? ref[快速掌握一个语言最常用的50%][https://blog.csdn.net/myan/article/details/3144661]
  • 其实各种各样的编程语言底层像if else, break,这些还是那一套语法树解析成对应的汇编,或者放到虚拟机由虚拟机来实现对应的汇编。这些大家都是一样的。但是不同的是,在不同语言设计过程中,在语法解析上做了很多工作,例如cpp在语法解析的时侯提供了右值等语法,让程序员可以降低消耗内存的去实现一些东西。java在语法中做了很多限制去约束程序员的代码规范,例如不支持多继承,增加了模块,反射和注释等等高级语法其实底层都是要转成一条条汇编,你用cpp完全也能突现的。但是人家java等是放在语言层次实现的,就会有很大的限制和提升。而python这些也是类似如此,各种语言其实都会封装一些各种各种的高级用法,这些用法在一定程度上决定了生态。这会导致喜欢大型业务项目编程的人倾向于java,喜欢追求性能且业务不怎么变化的领域倾向于++,喜欢算法设计和刚入门的新人倾向于语法简单并且封装程度高的python,这些都是法定的,从他们创造出来的那个时候,创始人其实就已经知道了这种语言会在哪些领域占据绝对优势,而其占据的优势会吸引新手,他们中的新手一部分成长为大牛后会首先为这个语言做贡献,形成良性循环,看看python的机器学习包这些。
    不像java等语言为了实现对象语义,类的存储占用很大,C++可以节省很多,因此速度非常快。-C++不像其他语言基于模块,还是在基于文本解析的方式加载别人的库和代码。

可以从事的岗位和要求的技术栈

参照技术认知和https://www.bilibili.com/video/BV1jR4y1r7on/?spm_id_from=333.337.search-card.all.click,了解下每个技术栈需要掌握啥。

过去,现在和未来的发展趋势

98时代C++主要聚焦于类的抽象等。
11年代针对各种并发,指针管理,stl库可用性,auto、range、统一初始化等代码简化的扩展,非常有用。14版本就是对11版本的修补,例如模板泛化和lamdba之类的。
17版本主要就是对auto,泛化性再一次进行加强了。
20是一个版本大更新,增加了模块非常重要,还有一些数据加速计算的库,还有协程的支持等等。
23年预计会对语法上再进行简化。
参照吴建中的演讲和程硕的演讲,可以知道我们单核的计算能力10年前就到了顶峰了,内核数一直在增,网络也是一直在增,这对于io密集型业务是免费的午餐。但是对于计算圈集型的业务其实非常难,现在的做法就是硬件加速或者下放内核态等等,这个趋势不会变,而语言也会用C++这种封装不多而且优化过的代码。


http://www.ngui.cc/article/show-862317.html

相关文章

Unity模型页签之Rig

Animation Type 动画类型 None 不存在动画 主要用于一些环境静态模型 Legacy 旧版动画类型 与Unity3.x及更早版本导入和使用动画 一般不使用 Generation&#xff1a;动画导入方法 Don’t Import&#xff1a;不导入动画 第2~4个选项&#xff1a;已禁用&#xff0c;勿使用 …

代码随想录算法训练营第59天|503.下一个更大元素II,42. 接雨水

503.下一个更大元素II 力扣题目链接 思路 单调栈循环数组 代码 class Solution { public:vector<int> nextGreaterElements(vector<int>& nums) {vector<int> res(nums.size(),-1);int count0;stack<int> st;for(int i0;i<nums.size()*2;i…

PAT——1084 外观数列

外观数列是指具有以下特点的整数序列&#xff1a; d, d1, d111, d113, d11231, d112213111, ...它从不等于 1 的数字 d 开始&#xff0c;序列的第 n1 项是对第 n 项的描述。比如第 2 项表示第 1 项有 1 个 d&#xff0c;所以就是 d1&#xff1b;第 2 项是 1 个 d&#xff08;对…

C++类与对象(上)

✅<1>主页&#xff1a;我的代码爱吃辣 &#x1f4c3;<2>知识讲解&#xff1a;C &#x1f525;<3>创作者&#xff1a;我的代码爱吃辣 ☂️<4>开发环境&#xff1a;Visual Studio 2022 &#x1f4ac;<5>前言&#xff1a;C的面向对象程序设计思想&a…

反向传播与梯度下降详解

一&#xff0c;前向传播与反向传播 1.1&#xff0c;神经网络训练过程 神经网络训练过程是&#xff1a; 先通过随机参数“猜“一个结果&#xff08;模型前向传播过程&#xff09;&#xff0c;这里称为预测结果 aaa&#xff1b;然后计算 aaa 与样本标签值 yyy 的差距&#xff…

从零开始的数模(十三)主成分分析

目录 一、概念 1.1线代知识补充 1.3主成分的命名与解释 1.4原理 1.5应用 ​编辑 二、基于python的主成分分析 2.1主要步骤 2.2.部分说明 2.3代码 完整代码 完整代码2 三、基于MATLAB的主成分分析 3.1算法步骤 ​编辑 3.2代码 完整代码 一、概念 1.1线代知识补充 …

python 两种方式,自动生成 requirements.txt 文件,再也不需要手动安装依赖了

本文收录于 GithubAndroidGuide&#xff0c;徐公&#xff0c;6 年大厂经验 前言 有一定 python 基础的人可能都知道&#xff0c;requirements.txt 文件是用来描述当前 python 项目所需要的依赖。 在工作当中&#xff0c;我们经常需要在不同的电脑运行 python 项目&#xff0c…

SQLite学习手册(一)

一、获取表的Schema信息&#xff1a; 1). 动态创建表。 2). 根据sqlite3提供的API&#xff0c;获取表字段的信息&#xff0c;如字段数量以及每个字段的类型。 3). 删除该表。 见以下代码及关键性注释&#xff1a; #include <sqlite3.h>#include <string&…

DPDK开发之KNI与内核交互的代码实现

KNI与内核交互的代码实现背景环境配置代码实现编译和执行总结背景 DPDK接管NIC之后&#xff0c;网卡接收到的网络数据都交由DPDK处理&#xff0c;但在开发过程中&#xff0c;我们可能只关注其中某一个协议&#xff0c;而其他协议并不需要我们处理&#xff1b;DPDK提供了KNI模块…

《NFL橄榄球》:纽约喷气机·橄榄1号位

纽约喷气机 纽约喷气机 成立于1960年所在地新泽西州东拉瑟福德 联赛/联盟隶属关系 美国美式橄榄球联盟&#xff08;1960&#xff0d;1969年&#xff09; Eastern Division&#xff08;1960&#xff0d;1969年&#xff09;全国橄榄球联盟 (1970–至今) 美国橄榄球联合会&am…