学习 C++ 到底有什么好处?

2023-05-16

学C++本身是教不会你编程的。你需要主动的、不断的扩展自己的知识领域。

写一个学生管理系统是一个很好的开端;但接下来,你还需要学习更多。

举例来说,“图形界面”究竟是怎么一回事呢?

我们知道,计算机屏幕实际上是一个“色点”组成的“点阵”;高清屏1920X1080@24bit,意思就是:它一共有1080行,每行1920个点;每个点又可表示2^24种不同颜色(以RGB格式表示;其中RGB的意思是红绿蓝三原色,每种原色8bit,256种取值,即有效取值为0~255)。

这个知识,就是计算机屏幕显示的根本;一切的一切,最终都要变成这样一个1920X1080的彩色点构成的点阵——我们的眼睛无法区分这么多点,看起来就是一整幅图片了。

我们的程序,想要显示出“图形界面”,就得管理好这个巨大的、彩色点构成的点阵;不仅如此,操作系统还可以同时运行一大堆程序、显示一大堆窗口……

那么,这么程序的这么多窗口,又是如何有条不紊的显示在屏幕上的呢?它们不会相互干扰吗?如何处理它们彼此之间的遮挡关系?那些压根看不见的窗口,也要每秒60帧的更新它的显示内容吗?那些一直没有改变过的窗口,是否每帧都必须从头生成内容?可不可以想办法节约掉这些不必要的计算动作?

你看,这是不是一个“学生管理系统”的超级放大版、复杂版?

为了管理这样一个复杂的东西,人们不得不搞出复杂的数据结构和针对性的各种算法;这样还不够,业界从MFC那复杂的消息循环、复杂的对话框数据交换开始,发展了许多年,这才找到Qt/GTK/WPF这样精炼高效、界面与逻辑分开的、方便易用的新架构——而这些东西,就需要面向对象之类东西的帮助了。

你可以算一算,如果每秒刷新60次,1920X1080的屏幕需要多大的计算量。

这么大的计算量,这么复杂的交互逻辑,只有C/C++系语言才hold得住。让其他语言来做它,就很容易浪费太多的性能。

不仅如此。

对于游戏之类应用,人们经常不得不用几十上百万个三角形拼凑出栩栩如生的3d模型;然后通过实时计算更新它们的位置,再模拟出几个光源去照它、处理它们在不同光照下的颜色/反射等等细节——经过各种复杂的处理流程之后,通过一个虚拟的摄像机,计算这个摄像机应该看到什么样的数据……最终,我们才能把这些数据投射到屏幕上,让用户看到一个逼真的3D世界。

CPU处理这样巨大的“阵列数据”显得非常笨拙,因为它只能一个顶点一个顶点的处理它;后来就加入了MMX/SSE/3D NOW之类SIMD指令集。但这东西的性能还是不太够……

再后来,就有了显卡;显卡后来又发展成了GPU。GPU支持的特性又越来越多,直到现在的实时光线追踪……

你看,仅仅一块屏幕,这后面都有多少东西。

其中,Qt/GTK/WPF之类,是别人写出来、帮我们管理常规应用的窗口的;而OpenGL、DX9/10/11/12之类,则是替我们和显卡打交道、帮我们写3D应用的——如果你要写程序,那就是A3D/unity之类引擎的天下了:它们不仅帮我们打包了图形图像以及音频动画模型等等方面的支持,还集成了游戏需要用到的其他许多基础功能,比如状态机、地图导航、碰撞检测等等东西。

学C++的好处是,这类贴近底层、贴近硬件或者性能要求严格的程序,往往只能用C/C++系语言才写的出来——用其他语言倒也不是不能写,但多少都差点意思。

总之,就好像学生管理系统一样,屏幕上的点阵同样需要一套又一套的管理系统;这些系统是写给我们程序员用的。

想要用好它,你最好搞明白它的基本原理;你要知道如此庞大复杂的东西,是如何管理的井井有条的——算法和数据结构只是入门,后面还有专门讲软件组织结构设计一般原则的软件工程。

写一个Qt很难,但知道它的设计思路并不难。除了C/C++,极少有哪种语言可以给你提供这个视野。

有了这些知识,那么Qt/GTK之类东西你用起来,就会感觉它非常简单,随便哪种抓起来就能用。这就叫知其然又知其所以然。

正因此,其实我是不太建议学C++时着急用各种框架的。因为学框架,你用任何一种语言,从C#到python,全都能学;但写一个Qt/GTK,写一个MySQL,写一个GCC……这类把计算机体系结构挖到根子的有趣挑战,只有C/C++系才鼓励你去做、而且也只有C/C++系语言才能提供无穷无尽的开源优质资源供你参考。

换句话说,当别人忙着追随Qt之类框架的新版本、看着它的新特性抓耳挠腮、不知这些新API该如何调用时,你可以借着C/C++这根拐杖,自豪的说“这个新特性,其实我都知道它是怎么实现的”!

别人学用数据库,你写玩具数据库;别人学用hive,你学着写自己的big-table/map-reduce——这类东西的原理性代码往往没多少,但难度往往会高一些。

但这个投入是值得的。

一旦理解了这些酷炫技术背后的原理,你就不会说“哎呀上学时我们居然还学老掉牙的MFC,现在看着Qt两眼一抹黑”,而是“Qt的抽象果然比MFC好,简单,清晰,易用。MVC模式果然是个天才的设计,你看GTK/WPF等等,它们也都是在这个模式的基础上发展起来的”……

换句话说,掌握一门新库,对于彻底理解了原理的你来说,就和吃饭喝水一样简单。因为在已经对它的五脏六腑有了清晰理解的你看来,它们本就该这样设计、它们这个设计是如此精典以至于只是看了它们的接口就让你有茅塞顿开之感。

总之,如果你想学着做一些面向用户的东西,其实并不建议你用C++。因为用它实现这类东西往往会比较繁琐。但如果你想挖到各种技术的根子,那么C/C++就是最最犀利的武器——没有之一。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

学习 C++ 到底有什么好处? 的相关文章

  • QT多窗口编程与文件IO编程

    目录 一 消息对话框 QMessageBox xff08 掌握 xff09 二 常用窗口类 xff08 掌握 xff09 三 主窗口类 QMainWindow xff08 重点 xff09 四 parent参数 xff08 掌握 xff09
  • QT数据库-网络编程-打包

    目录 一 讲解之前 二 数据库基本操作 三 模糊查询 二 编程之前 三 通信结构 一 设置应用图标 xff08 熟悉 xff09 二 Debug和Release模式 xff08 掌握 xff09 三 动态链接库 xff08 掌握 xff09
  • Visual Studio 2022 的安装和创建C++项目

    下面我们来讲一下如何下载安装VS 2022并且创建C 43 43 项目 1 下载 首先 xff0c 我们来到VS的微软官网下载地址 xff1a https visualstudio microsoft com zh hans vs 然后点击
  • 一起自学SLAM算法:写在前面

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 1 1 ROS简介 1 2 ROS开发环境搭建 1 3 ROS系统架构 1 4 ROS调试工具 1 5 ROS节点通信 1 6 ROS其
  • 一起自学SLAM算法:第1章-ROS入门必备知识

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 1 1 ROS简介 1 2 ROS开发环境搭建 1 3 ROS系统架构 1 4 ROS调试工具 1 5 ROS节点通信 1 6 ROS其
  • 一起自学SLAM算法:1.3 ROS系统架构

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 1 1 ROS简介 1 2 ROS开发环境搭建 1 3 ROS系统架构 1 4 ROS调试工具 1 5 ROS节点通信 1 6 ROS其
  • 关于NAND FLASH调试的一点总结

    https www freesion com article 5033494883 很久没接触过 nandflash 驱动 xff0c 最近工作又摸了 xff0c 于是顺便整理总结一下 nandflash 在我看来算是比较落后的存储设备 x
  • 一起自学SLAM算法:1.6 ROS其他重要概念

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 1 1 ROS简介 1 2 ROS开发环境搭建 1 3 ROS系统架构 1 4 ROS调试工具 1 5 ROS节点通信 1 6 ROS其
  • 一起自学SLAM算法:1.7 ROS2.0展望

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 1 1 ROS简介 1 2 ROS开发环境搭建 1 3 ROS系统架构 1 4 ROS调试工具 1 5 ROS节点通信 1 6 ROS其
  • 一起自学SLAM算法:第2章-C++编程范式

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 第2章 C 43 43 编程范式 2 1 C 43 43 工程组织结构 2 2 C 43 43 代码编译方法 2 3 C 43 43 编
  • 一起自学SLAM算法:第3章-OpenCV图像处理

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 第2章 C 43 43 编程范式 第3章 OpenCV图像处理 3 1 认识图像数据 3 2 图像滤波 3 3 图像变换 3 4 图像特
  • 一起自学SLAM算法:第5章-机器人主机

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 第2章 C 43 43 编程范式 第3章 OpenCV图像处理 第4章 机器人传感器 第5章 机器人主机 5 1 X86与ARM主机对比
  • 一起自学SLAM算法:第6章-机器人底盘

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 第2章 C 43 43 编程范式 第3章 OpenCV图像处理 第4章 机器人传感器 第5章 机器人主机 第6章 机器人底盘 6 1 底
  • 一起自学SLAM算法:第7章-SLAM中的数学基础

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 第2章 C 43 43 编程范式 第3章 OpenCV图像处理 第4章 机器人传感器 第5章 机器人主机 第6章 机器人底盘 第7章 S
  • 一起自学SLAM算法:第8章-激光SLAM系统

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 第2章 C 43 43 编程范式 第3章 OpenCV图像处理 第4章 机器人传感器 第5章 机器人主机 第6章 机器人底盘 第7章 S
  • 一起自学SLAM算法:8.1 Gmapping算法

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 第2章 C 43 43 编程范式 第3章 OpenCV图像处理 第4章 机器人传感器 第5章 机器人主机 第6章 机器人底盘 第7章 S
  • 一起自学SLAM算法:8.2 Cartographer算法

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 第2章 C 43 43 编程范式 第3章 OpenCV图像处理 第4章 机器人传感器 第5章 机器人主机 第6章 机器人底盘 第7章 S
  • Git - - subtree与submodule

    https www cnblogs com anliven p 13681894 html 目录 1 仓库共用 子仓库 子项目 2 submodule 与 subtree 对比 2 1 git submodule2 2 git subtre
  • 一起自学SLAM算法:第9章-视觉SLAM系统

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 第2章 C 43 43 编程范式 第3章 OpenCV图像处理 第4章 机器人传感器 第5章 机器人主机 第6章 机器人底盘 第7章 S
  • 一起自学SLAM算法:第10章-其他SLAM系统

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 第2章 C 43 43 编程范式 第3章 OpenCV图像处理 第4章 机器人传感器 第5章 机器人主机 第6章 机器人底盘 第7章 S

随机推荐

  • 一起自学SLAM算法:第11章-自主导航中的数学基础

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 第2章 C 43 43 编程范式 第3章 OpenCV图像处理 第4章 机器人传感器 第5章 机器人主机 第6章 机器人底盘 第7章 S
  • 一起自学SLAM算法:11.5 强化学习与自主导航

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 第2章 C 43 43 编程范式 第3章 OpenCV图像处理 第4章 机器人传感器 第5章 机器人主机 第6章 机器人底盘 第7章 S
  • 一起自学SLAM算法:第12章-典型自主导航系统

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 第2章 C 43 43 编程范式 第3章 OpenCV图像处理 第4章 机器人传感器 第5章 机器人主机 第6章 机器人底盘 第7章 S
  • 一起自学SLAM算法:第13章-机器人SLAM导航综合实战

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 第2章 C 43 43 编程范式 第3章 OpenCV图像处理 第4章 机器人传感器 第5章 机器人主机 第6章 机器人底盘 第7章 S
  • 一起自学SLAM算法:13.4 基于自主导航的应用

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 第2章 C 43 43 编程范式 第3章 OpenCV图像处理 第4章 机器人传感器 第5章 机器人主机 第6章 机器人底盘 第7章 S
  • 在ubuntu18.04中安装opencv_contrib-3.2.0闭坑记录

    由于最近要在OpenCV3中使用SIFT和SURF特征提取 xff0c 而自从OpenCV2升级到OpenCV3版本后 xff0c SIFT SURF等这些算法都被移出opencv默认项目库 xff0c 而被放到叫opencv contri
  • 在ROS中使用超声波(sonar)导航避障

    1 下载sonar layer的代码 https github com DLu navigation layers 实际只需要其中的range sensor layer放到工作空间catkin make 实验时放置于src中 xff0c 可
  • rtabmap更加适合视觉SLAM建图和导航

    slam问题目前主要集中在如何建立一个好的地图 xff0c 至于后续如何使用地图这部分工作研究的不多 xff0c 不过我个人恰好在做这部分工作所以答一下个人见解 首先 xff0c 有一张好的地图 xff0c 是导航或地图语义分析等应用的前提
  • Git应用详解第十讲:Git子库:submodule与subtree

    https www cnblogs com AhuntSun blog p 12736934 html 前言 前情提要 xff1a Git应用详解第九讲 xff1a Git cherry pick与Git rebase 一个中大型项目往往会
  • 单片机串口通信程序

    本文总结了两种比较简单的关于串口发送接收的程序 xff0c 以下是步骤 xff1a 定义数据 xff1a unsigned char idata URX 10 61 0 串口接收数组 unsigned char idata URX Num
  • Linux当中的压栈和出栈指令以及跳转指令详细教程

    1 跳压栈出栈指令 xff1a 我们通常会在 A 函数中调用 B 函数 xff0c 当 B 函数执行完以后再回到 A 函数继续执行 要想 再跳回 A 函数以后代码能够接着正常运行 xff0c 那就必须在跳到 B 函数之前将当前处理器状态保存
  • MySQL5.7版本在Ubuntu(WSL环境)系统安装

    课程中配置的WSL环境是最新的Ubuntu22 04版本 xff0c 这个版本的软件商店内置的MySQL是8 0版本 所以我们需要额外的步骤才可以安装5 7版本的MySQL 安装操作需root权限 xff0c 你可以 xff1a 通过 su
  • 动态库静态库的区别

    1 制作过程 静态库 xff1a 生成 o文件后 ar rcs o libxxx a 动态库 xff1a 生成 o文件时 xff0c 静态库是 c选项 xff0c 而动态库是 fpic FPIC xff0c 因为动态库需要生成与位置无关的代
  • 怎么把PWM信号转为模拟量

    有一个测量位置变化的位置传感器 xff0c 用万用表电压档测量传感器的输出信号 xff0c 结果显示的是模拟量信号 xff0c 即位置和信号输出大小呈线性关系 但是 xff0c 用示波器 xff08 Picoscope 4227 xff09
  • STM32环形串口队列程序 大数据串口收发 实时不丢包 串口程序平常产品开发中编写或移植的程序并亲自测试通过,均为工程文件格式,可直接编译使用

    STM32环形串口队列程序 大数据串口收发 实时不丢包 串口程序平常产品开发中编写或移植的程序并亲自测试通过 xff0c 均为工程文件格式 xff0c 可直接编译使用 该程序为大数据量吞吐的串口收发例程 xff0c 中断接收 xff0c 边
  • C语言中的函数返回值、return用法、return 0详解

    1 函数返回值 定义 xff1a 函数的返回值是指函数被调用之后 xff0c 执行函数体中的代码所得到的结果 xff0c 这个结果通过return语句返回 没有返回值的函数为空类型 xff0c 用void表示 一旦函数的返回值类型被定义为
  • TCP协议

    TCP xff08 Transmission Control Protocol xff09 是面向连接的可靠的通讯协议 TCP需要经过三次握手建立连接 xff0c 并在断开时通过四次挥手释放连接 TCP通过应答确认 超时重传 xff08 R
  • UART&RS232&RS485的区别

    UART RS232 RS485在串口通信中 xff0c 主要区别是电平的不同 xff0c 其中UART通常使用TTL电平 TTL TTL全名是晶体管 晶体管逻辑集成电路 Transistor Transistor Logic 输入高电平最
  • 思岚雷达rplidar S1配置调试全纪录

    耗时10天 xff0c 终于从零开始用QT在Ubuntu系统下完成了一个雷达避障系统的设计 xff0c 这文章的主要目的是将配置的流程和遇到的问题记录下来 xff0c 以供自己以后遇到一样的问题时可以有个参考 一 思岚雷达的配置 1 配置的
  • 学习 C++ 到底有什么好处?

    学C 43 43 本身是教不会你编程的 你需要主动的 不断的扩展自己的知识领域 写一个学生管理系统是一个很好的开端 xff1b 但接下来 xff0c 你还需要学习更多 举例来说 xff0c 图形界面 究竟是怎么一回事呢 xff1f 我们知道