AlgoC++第三课:C++世界观

news2024/9/21 12:36:58

目录

  • C++世界观
    • 前言
    • 1. 程序逻辑
    • 2. 内存的逻辑
    • 3. 调度的逻辑
    • 4. 编译的逻辑
    • 5. 作用域的逻辑
    • 6. 命名空间的逻辑
    • 7. 生命周期的逻辑
    • 8. C++类的逻辑
    • 9. 编译时和运行时的逻辑
    • 总结

C++世界观

前言

手写AI推出的全新面向AI算法的C++课程 Algo C++,链接。记录下个人学习笔记,仅供自己参考。

本次课程主要讲解 C++ 世界观

课程大纲可看下面的思维导图

在这里插入图片描述

1. 程序逻辑

在操作系统层面上,可以有多个程序进程, 而每个进程又是由一个主线程和多个子线程组成,值得注意的是:

  • 进程是静态的是上下文,线程是动态的,用来执行具体代码

  • 每个进行必有主线程,主线程结束,则进程停止,子线程可以创建多个

  • 每个进程都有属于它的堆内存,进程内所有线程共用,但与其它进程是隔离的

在这里插入图片描述

2. 内存的逻辑

之前提到过每个进程都有属于它的堆内存,而每个线程又有属于它的栈内存,我们主要关注栈和堆内存。C++ 是强调内存的语言,你需要知道你的变量在哪里,进而生命周期是如何定义的,值得注意的是:

  • 每个进程都有属于它的堆内存,进程内所有线程共用,但与其它进程是隔离的
  • 每个线程都有属于自己的栈内存,用来储存当前执行位置的函数调用入参、局部变量
  • 之所以叫栈内存,因为采用的是栈的数据结构来表示函数的调用入参
  • 堆内存很大,基本接近内存条大小,栈内存很小,一般4MB。stackoverflow 就是递归超过栈空间时的异常
  • 比如 char a[100] 开辟的就是堆内存空间,而 new a[100] 开辟的就是栈内存空间

在这里插入图片描述

3. 调度的逻辑

CPU 可以形象化为一个工人,不考虑多核,它就是个一次执行一个任务的工人。它只能串行执行任务,但是它的速度特别特别快,一秒数亿次计算。现实生活中,我们需要大量并行的场景,比如播放音乐的同时打游戏,那串行的 CPU 如何来解决并行的问题呢?因此引入线程调度的概念

想象下这样一个场景,假如你是一名厨师,现在有三个餐桌等着你上菜,你应该如何上菜保证让客户都满意?

在这里插入图片描述

我会采用每个桌子各出一个菜的方式,使得大家觉得出餐是并行的,营造一种厨房里有三个厨师的假象,其实只有你一个,只不过你有点强,同时炒了三个锅的菜,来回切换,只是你切换的时间非常快,让人毫无察觉😂

在炒菜的同时厨师还需要为每个餐桌记住状态(如已经上了几个菜了,都上了些啥菜,还剩下啥菜),在第二次为该餐桌炒菜时可以顺序推进

在这里,餐桌的菜品就是需要执行的代码,餐桌即线程,而餐桌的状态,则采用寄存器存储,当下一次处理该线程时,调出寄存器内的状态

寄存器存储的线程状态,称之为现场,储存现场,恢复现场,值得注意的是:

  • 引入线程调用是为了串行模拟并行,CPU 太快了,使用者感受不出来区别
  • 每个线程分配的执行时间,称之为时间片,通常是非常小的单位
  • 由于调度的存在,它会在机器指令层面的任何一句上中断,而后调用其它线程。这也是 C++ 语言需要了解的逻辑
  • 过多的线程,会让 CPU 消耗大量精力处理存储现场、恢复现场等准备工作。降低执行任务的频率,让电脑变得卡顿

4. 编译的逻辑

在 C++ 的世界观中,我们一定要有编译和链接的概念,一个程序从代码到执行是包括编译和链接两个部分的。

其中,编译又可以分为预处理、编译、汇编三个部分

  • 预处理:把 C++ 源代码的宏语法进行展开,并整理 C++ 代码为翻译单元
  • 编译:将整理后的翻译单元编译成汇编代码
  • 汇编:将汇编代码编译为目标机器的机器码

链接时将所有的 C++ 得到的机器码联合起来,成为一个最终的可执行程序(集中力量办大事)

编译时只处理语法的正确性,对于函数调用,仅储存名称符号;链接时全局查找,为每一个符号找到具体实现,找到多个或者没找到都会编译失败,也因此我们引入声明实现的概念,声明是外壳,实现是实体

int compute(int a, int b);  // 声明

int compute(int a, int b){	// 实现
    return a * b;
}

5. 作用域的逻辑

作用域有文件构建的作用域和大括号构建的作用域

对于文件构建的作用域,直接在 C++ 文件最外层定义的任何东西(如变量、类、函数),其作用于整个程序所有位置,而加上了 static 后,只作用于当前文件内

编译时,各文件相互不干扰

链接时,同名全名变量或同名同参的函数会冲突。static 可使得链接时对外不可见

访问其它 C++ 变量可以加上 extern 关键字,访问其它 C++ 函数加声明

对于大括号构建的作用域,出作用域,变量失效,内存释放;任何作用域,都应该能访问其父级领域内的所有成员,反过来不行

{
    int x = 123;
    
    {
        int y = x + 5;
    }
}

{
    int x = 567;
}

6. 命名空间的逻辑

命名空间是为作用域设置一个名称,方便写代码。访问时采用作用域 :: 符合,未命名的作用域,视作全局作用域

namespace{
    int number = 123;
}

namespace AA{
    int number = 567;
}

int main(){
    
    cout << number << endl;		// 123
    cout << ::number << endl;	// 123
    cout << AA::number << endl;	// 567
    
    return 0;
}

7. 生命周期的逻辑

关于声明周期的逻辑,有以下几点值得注意:

  • 每个作用域都有生命周期,是动态存在的。而命名空间是静态的,是为了写代码方便的
  • 全局变量,属于全局作用域,随程序结束而销毁
  • 进入作用域,变量构造,出作用域,变量释放,析构

8. C++类的逻辑

解决多态,是 C++ 类处理 OOP(Object Oriented Programming) 的核心逻辑而二级指针和虚表,是实现多态动态绑定的主要手段

9. 编译时和运行时的逻辑

C++ 有编译时(链接时)和运行时的区分

链接时:关注的是 cpp 文件、o 文件、so、a,关头文件路径、库文件位置

运行时:关注运行依赖的库所在位置,当前工作目录(workspace folder),环境变量

库路径:在链接时和运行时都要关注,容易让人混淆。链接时只关注是否找到即可。而运行时必须保证加载成功。并且链接时与运行时查找 so 的方式截然不同。运行时查找 .so 动态库的方式是通过设置环境变量 LD_LIBRARY_PATH 来指定动态库搜索路径,而链接时查找 .so 动态库的方式则是通过编译链接时指定 -l 选项和 -L 选项来指定动态库的搜索路径和库名

工作目录:很多人容易忽视的问题,当你 open("a.txt") 时,这个 a.txt 表示工作目录下的 a.txt,工作目录也称之为当前目录,在各个配置中可以看到如 cwd、workspacedir、pwd。当在调试或者运行程序时提示找不到文件,可以检查下文件是否放在了工作目录下。

总结

本次课程了解整个C++的世界观,特别是调度和编译的逻辑,要区分链接时和运行时库路径的查找方式。而对于C++类的逻辑并没有深究,期待下次课程😄

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/448590.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何查看CPU的L2、L3缓存的容量

可以用CPU-Z&#xff0c;不过需要下载。 可以用命令&#xff1a; wmic cpu get L2CacheSize,L3CacheSize结果&#xff1a;

Golang微服务一把嗦 用户微服务集成主流最新go技术栈

声明&#xff1a;此文章为博主个人学习记录&#xff0c;仅供学习和交流&#xff0c;如有侵权请联系博主。 前言 前段时间&#xff0c;因为本地k8s环境一直出问题&#xff0c;线上云环境也用不起&#xff0c;&#xff08;后面搞定了再慢慢学习&#xff09;所以就暂时搁置了k8s学…

SQL Server基础 第二章 表结构管理

目录 一、数据类型 1&#xff0c;字符类数据类型 2&#xff0c;数值型数据类型 3&#xff0c;日期/时间型数据类型 二、主键&#xff08;Primary key&#xff09; 三、默认值 四、唯一键&#xff08;Unique&#xff09; 五、自增标识 六、约束 七、外键 一、数据类型 …

node+vue+mysql+java健身房网站管理系统

通过大数据管理的方法对健身房管理系统进行了详细的设计说明以及介绍&#xff0c;对健身房管理系统进行了开发和实践。作为一个健身房网站&#xff0c;它为用户提供了一个良好的求知平台。让用户能更好地了解健身带来的好处。前端技术&#xff1a;nodejsvueelementui,视图层其实…

3D智能四向穿梭车在电商物流中的应用|HEGERLS箱式四向穿梭车系统在服装制造仓的创新应用

四向穿梭车技术是物流仓储系统中的革命性技术&#xff0c;也由于四向穿梭车对于场地的适应性非常强的特性&#xff0c;可实现前后、左右、上下六维运行&#xff0c;结合提升机的布置和输送系统的布局&#xff0c;灵活调整四向车的空间布局&#xff0c;使某些不规则场地和闲置空…

NXP公司LPC21xx+热敏电阻实现温度检测

LPC2131/32/34/36/38微控制器基于16位/32位Arm7TDMI-S™CPU&#xff0c;支持实时仿真和嵌入式跟踪&#xff0c;具有尺寸小&#xff0c;功耗低&#xff0c;多个32位定时器、单/双10位8通道ADC、10位DAC、PWM通道、47个GPIO线&#xff08;它们拥有多达9个边沿或电平触发的外部中断…

SpringCloud 项目如何方便 maven 打包以及本地开发

一、背景 springcloud-alibaba &#xff0c;使用 nacos 做配置中心&#xff0c;maven 作为构建工具。为了防止 test 、prod 环境配置文件覆盖问题&#xff0c;使用 mvn -P 命令。 二、项目 pom 文件 1. 利用 resources 标签来指定目录&#xff0c;build > resources 标签&a…

【轴承故障检测】滚动轴承中进行基于振动的故障诊断研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

110.【十万字带你深入学习23种设计模式】

Java 23种设计模式 (一)、设计模式相关内容介绍1.软件设计模式概述(1).软件设计模式的产生背景(2).软件设计模式的概念(3).学习设计模式的重要性(4).设计模式分类 2.UML图(1).类图概述(2).类图的作用(3).类图表示法 3.软件设计原则(1).开闭原则 (重写不修改)(2).里氏代换原则 (…

Node内置模块 【https模块】

文章目录 &#x1f31f;前言&#x1f31f;https模块&#x1f31f;https原理&#x1f31f;SSL&#x1f31f;使用https&#x1f31f;搭建HTTPS服务器&#x1f31f;写在最后 &#x1f31f;前言 哈喽小伙伴们&#xff0c;新的专栏 Node 已开启&#xff1b;这个专栏里边会收录一些N…

不得不说的结构型模式-组合模式

组合模式是一种结构型设计模式&#xff0c;它允许您将对象组合成树形结构&#xff0c;并以统一的方式处理它们。该模式基于递归组合的想法&#xff0c;其中一个组件可以由许多更小的组件组成&#xff0c;这些更小的组件可以由更小的组件组成&#xff0c;以此类推。 在组合模式中…

Latex安装与简介

文章目录 Latex一.步入Latex的两种方式:1.下载安装与Vscode集成2.在线的编辑器: overleaf 二.解决中文输入的问题三.简单介绍 Latex 一.步入Latex的两种方式: 1.下载安装与Vscode集成 texlive下载与安装参考: https://blog.csdn.net/weixin_47581344/article/details/1243560…

Midjourney 提示词工具(10 个国内外最好最推荐的)

Midjourney&#xff0c;是一个革命性的基于人工智能的艺术生成器&#xff0c;可以从被称为提示的简单文本描述中生成令人惊叹的图像。Midjourney已经迅速成为艺术家、设计师和营销人员的首选工具&#xff08;包括像我这样根本不会设计任何东西的无能之辈&#xff09;。 为了帮…

前端优化的分析

前端优化的分析 目录概述需求&#xff1a; 设计思路实现思路分析渲染层性能更好的API 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for change,cha…

强化学习技巧

此软件包处于维护模式&#xff0c;请使用Stable-Baselines3 (SB3)获取最新版本。您可以在 SB3 文档中找到迁移指南。 本节的目的是帮助您进行强化学习实验。它涵盖了有关 RL 的一般建议&#xff08;从哪里开始、选择哪种算法、如何评估算法等&#xff09;&#xff0c;以及使用自…

嵌入式QT (Qt 信号与槽)

一、Qt 信号与槽机制 因为有了信号与槽的编程机制&#xff0c;在 Qt 中处理界面各个组件的交互操作时变得更加直观和简单。 信号&#xff08;Signal&#xff09;就是在特定情况下被发射的事件。 GUI 程序设计的主要内容就是对界面上各组件的信号的响应&#xff0c;只需要知道…

MySQL_第05章_排序与分页

第05章_排序与分页 讲师&#xff1a;尚硅谷 - 宋红康&#xff08;江湖人称&#xff1a;康师傅&#xff09; 官网&#xff1a; http://www.atguigu.com 1. 排序数据 1.1 排序规则 使用 ORDER BY 子句排序 ASC&#xff08;ascend&#xff09;: 升序 DESC&#xff08;desc…

物流管理APP软件开发公司 让货运变得更简单

随着互联网技术的发展&#xff0c;人们的生活方式也发生了很大的变化&#xff0c;移动互联网如今已经深入到生活的方方面面&#xff0c;就连物流运输行业也开始涌现出各种货运物流管理APP软件&#xff0c;让整个物流管理过程更加简单。下面我们一起来看一下为什么越来越多的运输…

数据库实验 | 第4关:修改多个数据表的存储过程

任务描述 本关任务&#xff1a; 图书管理数据库有读者reader图书book借阅数据表 读者表reader有读者证号dzzh、姓名xm、性别xb、身份sf、电话号码dhhm字段 图书表book有条形码txm、书名sm、分类号flh,作者zz,出版社cbs,出版日期cbrq,售价sj,典藏类别dclb,在库zk,币种bz字段 …

【DEBUG】错误手册集

文章目录 1.sshd启动报错,无法绑定端口2.克隆后的虚拟机可以联网&#xff0c;但是Xshell连接失败的解决办法 1.sshd启动报错,无法绑定端口 (1) 首先排查是否有端口占用&#xff08;没有发现问题&#xff09; netstat -ano | grep sshd(2) 查看 message 日志存在如下错误信息&…