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

news/2024/12/22 13:16:17/

目录

  • 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;		// 123cout << ::number << endl;	// 123cout << AA::number << endl;	// 567return 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.ppmy.cn/news/48289.html

相关文章

项目支付接入支付宝【沙箱环境】

前言 订单支付接入支付宝&#xff0c;使用支付宝提供的沙箱机制模拟为订单付款。我这里主要记录一下沙箱环境如何接入到系统中&#xff0c;具体细节的实现。按照官方文档来就可以了。 1、使用步骤 这里有几个重要数据要拿到&#xff0c;一个是支付宝的公钥和私钥&#xff0c…

为什么实现 API 最佳实践需要重新考虑安全性

随着应用程序编程接口 (API) 的使用与日俱增&#xff0c;实现和维护有效安全性的挑战从未像现在这样大。 由于缺乏管理 API 的单一标准&#xff0c;这意味着团队不能仅依靠工具来解决安全问题&#xff0c;因此这一挑战变得更加严峻。没有任何一种产品可以解决 API 环境的每种…

GitLab合并操作自动构建Jenkins任务

最终实现当git库 有合并操作自动构建jenkins的指定任务 1、安装Build Authorization Token Root插件 Build Authorization Token Root&#xff1a;使用拥有读取权限的匿名用户访问&#xff0c;配置钩子链接时需要用到,如果不使用&#xff0c;每次访问链接都需要提供认证&#…

【Linux】组管理和权限管理

目录 1 Linux组的基本介绍2 文件/目录所有者2.1 查看文件的所有者2.2 修改文件所有者 3 组的创建3.1 基本指令3.2 应用实例 4 文件/目录 所在组4.1 查看文件/目录所在组4.2修改文件/目录所在的组 5 其他组6 改变用户所在组6.1 改变用户所在的组6.2 应用实例 7 权限介绍8 rwx权限…

【C++类和对象】类和对象(中):拷贝构造函数 {拷贝构造函数的概念及特征,拷贝构造函数不能使用传值传参,编译器自动生成的拷贝构造函数}

四、拷贝构造函数 4.1 概念 在创建对象时&#xff0c;可否创建一个与已存在对象一某一样的新对象呢&#xff1f; 拷贝构造函数&#xff1a;只有单个形参&#xff0c;该形参是对本类类型对象的引用(一般常用const修饰)&#xff0c;在用已存在的类类型对象创建新对象时由编译器…

确保实时操作系统(RTOS)设备中的数据安全

导读1月28日大家庆祝了数据保护日&#xff0c;这是一项旨在促进保护数据隐私和安全的国际活动。为了提高人们对数据保护的意识&#xff0c;讨论实时操作系统中数据安全的问题势在必行。目前非常规操作系统已被广泛使用&#xff0c;所以了解这一系统非常重要&#xff0c;尤其是涉…

ElasticSearch第十六讲 ES 索引模板Index Template与Dynamic Template

Index Template Index Templates可以帮助你设定Mappings和Settings,并按照一定的规则,自动匹配到 新创建的索引之上。模版仅在一个索引被新创建时,才会产生作用。修改模版不会影响已创建的索引,你可以设定多个索引模版,这些设置会被“merge”在一起,你可以指定“order”…

上岸美团,我的面经!

作者&#xff1a;阿秀 校招八股文学习网站&#xff1a;https://interviewguide.cn 这是阿秀的第「257」篇原创 小伙伴们大家好&#xff0c;我是阿秀。 欢迎今年参加秋招的小伙伴加入阿秀的学习圈&#xff0c;目前已经超过 2200 小伙伴加入&#xff01;去年认真准备和走下来的基…