- 博客(66)
- 收藏
- 关注
原创 C++:开胃菜练习项目---定长内存池的实现以及测试
作为程序员(C/C++)我们知道申请内存使用的是malloc,malloc其实就是一个通用的大众货,什么场景下都可以用,但是什么场景下都可以用就意味着什么场景下都不会有很高的性能,下面我们就先来设计一个定长内存池做个开胃菜,当然这个定长内存池在我们后面的高并发内存池中也是有价值的,所以学习目的有两层:
2025-02-25 12:41:59
695
原创 C++:命名空间
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{} 中即为命名空间的成员。// N是命名空间的名字,一般开发中是用项目名字做命名空间名。// 命名空间中可以定义变量/函数/类型int val;
2025-02-22 20:27:04
230
原创 Linux操作系统:进程控制_进程的创建、终止、等待
我们先来理一个关系,我们在写C/C++程序时,我们的主函数main经常要返回一个值:0,这也叫做退出码。那为什么要返会0呢?返回100可以吗?上述一个这么简单的代码,我们返回值是0,打印出来的结果也是没问题的。ppid是我们的bash进程,我们之前已经讲过,从命令行启动的进程的父进程都是bash.那我们把返回值改成100会不会有问题呢?返回值依然是没问题的所以这又能说明什么呢?我们直接看一个命令:echo $?查看父进程bash获取到的最近一个进程的退出码这怎么有我们刚刚设定的返回值100。
2024-11-23 19:31:50
953
1
原创 Linux操作系统:Linux内核进程调度队列_大O(1)调度算法
在运行队列里,CPU会给我们维护一个140队列的数组,虽然本质上是个数组,但是里面放的是一个一个进程的pid地址。我们目前所学的Linux系统,一般都是分时操作系统,主要讲究的是公平,所以在这个队列数组里,我们只有下标为100-139的位置可以用,为40个队列。看到这个40有没有很熟悉,我们在学习进程优先级队列时我们学到过,调整进程优先级时,nice值不能随便调整,它的范围为[-20,19],这使我们的优先级大小范围控制在了[60,99]。nice的范围同样是40个大小,那这两者之间有没有什么联系呢。
2024-11-19 18:27:00
805
原创 Linux操作系统:程序地址空间的第一讲:对程序地址空间的初步认识
在地址空间中,有着堆区、栈区等等被划分成一块一块的区域,那这是怎么划分的呢?地址空间的本质其实就是内核的一个struct结构体,名叫mm_struct,管理着各个区域的区域划分。内部有很多的属性表示strat,end的范围。那栈举例:因为地址空间由低到高,所以start指向下面低地,end指向高地址为了更加证实这一点,我们看一下内核数据结构 :划分的这段区域,我们是都可以使用的。
2024-11-16 19:40:29
977
原创 Linux操作系统:详细认识命令行参数和环境变量与其在操作系统中的具体应用
不知道大家有没有过疑惑,我们一开始学习C语言就知道,我们写代码一定会写的一个主函数main只能有一个,并且这个main函数的参数还是可带可不带的,这就很让人疑惑,我们经常用的就是不带参数的场景,那带参数的main函数该如何用呢?
2024-11-13 17:34:14
760
原创 Liunx操作系统:对进程的优先级的详细讲解
这个概念与我们现实生活中遇到的优先级相同,那么在操作系统里,进程优先级就是指定进程获取某种资源的先后顺序。在CPU的正常工作中,操作系统要维护CPU的一个运行队列,我们的进程PCB以一个先进先出的方式挂起在CPU的运行队列里,等待CPU的调度,等时间片用完,CPU就会将这个进程剥离,换下一个进程进行调度。这样在CPU的运行队列里进行排队的方式就是获取CPU资源的先后顺序,在队列头部就是优先级较高的进程,在队列尾部就是优先级较低的进程。
2024-11-11 21:17:19
1041
原创 Linux操作系统:学习进程_了解并掌握进程的状态
对进程状态之间转换感到头疼,只听书本概念根本无法理解,死记硬背不是什么好的解决方法。只有进行底层操作去了解每一个进程状态,才能彻底弄清楚进程状态是如何转换的。
2024-11-08 19:45:32
919
原创 Linux操作系统:学习进程_对进程概念的深入了解
在学校里学习到进程,听老师讲的似懂非懂,每天都有在接触着进程,但是对于课本上的知识理解起来又是格外的难,这篇博客,我用Linux操作系统举例,来带大家深入的理解一下进程,摆脱对这个问题的困扰。
2024-11-06 13:08:22
1133
原创 Linux操作系统:进入进程学习的前期铺垫__对操作系统的认识与理解
在我们购买手机或者笔记本时,我们表面上看到的只是有显示屏与键盘鼠标等外设组成的一台设备,但是,当我们开机时,会有短时间的动画显示,这时设备在进行的工作就是帮我们打开操作系统这个软件,来使我们间接对手机上的软件进行管理。
2024-11-03 15:03:08
867
原创 Linux操作系统:进入进程学习的前期铺垫__对冯诺依曼结构的认识与理解
为什么我们会选择内存做存储器,而不是其他的存储单元。就是因为内存便宜能被大众所接受,又能很好的提高计算机效率,以较高的性价比让群众买到效率高的计算机。 能很好的服务大众,这也就是冯诺依曼体系结构伟大的原因。
2024-10-30 19:05:28
1118
原创 Linux:在xshell中演示在没有图形化界面的情况下如何使用gdb工具对代码进行调试
gdb调试工具只是帮助我们找到bug所在,真正要去解决bug的还是我们。
2024-10-23 15:32:41
914
原创 动态规划:17.简单多状态 dp 问题_买卖股票的最佳时机III_C++
我们在状态表示的时候,一般都会创建一个数组dp,也就是我们所说的dp表,我们要做的就是把每一个状态的值填入这个表内,最终这个表内的某一个值可能就是我们要返回的值。越学越深入,动态规划也是熟能生巧,在题目中没有明显给出的时候,我们就要凭借自己做题的经验来确定,所以就需要我们大量的做题。这里需要注意的是,我们为什么在买入到卖出时,需要买入状态交易次数减一的那次状态,因为我们。当我们填第一天结束时的状态时,我们需要第0天的状态,但是没有第0天,那么填表时就会越界。所以我们在这里不能初始化为-∞,可以初始化为。
2024-10-20 21:15:42
978
原创 动态规划:16.简单多状态 dp 问题_买卖股票的最佳时机含手续费_C++
我们在状态表示的时候,一般都会创建一个数组dp,也就是我们所说的dp表,我们要做的就是把每一个状态的值填入这个表内,最终这个表内的某一个值可能就是我们要返回的值。我们dp表的大小比天数又多了一天,所以我们填表时从dp表的第二个位置开始填,其下标正对应天数,但是我们prices数组的下标并不对应,这里需要注意它的下标。越学越深入,动态规划也是熟能生巧,在题目中没有明显给出的时候,我们就要凭借自己做题的经验来确定,所以就需要我们大量的做题。这个就是状态转移方程,我们要做的,就是推出dp[i][j]等于什么。
2024-10-18 19:45:31
1059
原创 Linux:Linux中第一个小程序_进度条
在日常生活中,我们下载软件,文件,都会都一个进度显示,来告知我们的下载进度,接下来我们可以自己手搓一个进度条,在我们自己写扫雷、贪吃蛇等小游戏时,可以做一个游戏加载进度使用在手搓进度条之前,我们需要一些知识作为铺垫,这些知识大家或多说少会有了解,但是我为了让大家更好的了解,我会把这些知识再细讲一下,方便理解。
2024-10-16 19:06:20
1750
原创 动态规划:15.简单多状态 dp 问题_买卖股票的最佳时机含冷冻期_C++
我们在状态表示的时候,一般都会创建一个数组dp,也就是我们所说的dp表,我们要做的就是把每一个状态的值填入这个表内,最终这个表内的某一个值可能就是我们要返回的值。越学越深入,动态规划也是熟能生巧,在题目中没有明显给出的时候,我们就要凭借自己做题的经验来确定,所以就需要我们大量的做题。这里要注意,我们第一天的三种状态所需要对应的前一天的状态是没有的,所以我们为了填表正确,需要对第一天的三种状态进行是手动初始化。不讲什么复杂的,简单来说状态转移方程就是 dp[i][j]等于什么 dp[i][j]=?
2024-10-15 20:13:57
761
原创 C语言:在Visual Studio中使用C语言scanf输入%s出现的栈溢出问题
学了C++之后就很少使用C语言了,今天帮同学解答C语言问题,遇到了一个我以前没有遇到过的问题。
2024-10-14 20:22:17
547
1
原创 动态规划算法:14.简单多状态 dp 问题_粉刷房子_C++
例如:我们想把i位置涂刷成红色,那么我们直接用上一个房子(i-1)的蓝绿状态比较取最小值就可以知道哪种种状态花费最小,再加上涂刷该位置的花费cost[i][0],就是涂刷到该位置时的总最小花费dp[i][0]再求dp[1][0]dp[1][1]dp[1][2]时,状态转移方程会加上cost[0][0]、cost[0][1]、cost[0][2]我也不懂,我们慢慢来。我们需要对dp[0][0]、dp[0][1]、dp[0][2]三个位置初始化,防止越界,也使得在填后一个位置时,填表正确。
2024-10-14 16:19:00
825
原创 数据结构进阶:二叉搜索树_C++
1. map和set特性需要先铺垫二叉搜索树,而二叉搜索树也是一种树形结构2. 二叉搜索树的特性了解,有助于更好的理解map和set的特性3. 二叉树中部分面试题稍微有点难度,在前面讲解大家不容易接受,且时间长容易忘4. 有些OJ题使用C语言方式实现比较麻烦,比如有些地方要返回动态开辟的二维数组,非常麻 烦。
2024-10-09 21:29:05
1325
原创 C++中的多态(详细讲解)
多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了 Person。Person对象买票全价,Student对象买票半价。必须通过基类的指针或者引用调用虚函数被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。
2024-09-29 20:24:43
2763
原创 动态规划算法:13.简单多状态 dp 问题_打家劫舍II_C++
我们在状态表示的时候,一般都会创建一个数组dp,也就是我们所说的dp表,我们要做的就是把每一个状态的值填入这个表内,最终这个表内的某一个值可能就是我们要返回的值。由题目可知,小偷不可以偷相邻的两个房间,并且题目告诉我们第一个房间是和第二个房间相连的,所以小偷偷完第一个房间,就不可以偷最后一个房间。我也不懂,我们慢慢来。我们分析的首尾两种状态是本道题的两种大状态,因为小偷只能这样做抉择,不然就会报警,所以说,我们最终的答案要要。第一个位置偷:偷1不偷2,并且不偷最后一个房间,所以左下标为2,右下标为n-2。
2024-09-27 20:54:05
1070
2
原创 动态规划算法:12.简单多状态 dp 问题_打家劫舍_C++
我们在状态表示的时候,一般都会创建一个数组dp,也就是我们所说的dp表,我们要做的就是把每一个状态的值填入这个表内,最终这个表内的某一个值可能就是我们要返回的值。分析问题的过程中把重复子问题抽象成我们的状态表示,这个更难理解,一切的基础都是我们先对动态规划算法熟练运用。越学越深入,动态规划也是熟能生巧,在题目中没有明显给出的时候,我们就要凭借自己做题的经验来确定,所以就需要我们大量的做题。这个就是状态转移方程,我们要做的,就是推出dp[i]等于什么。我们创建dp表就是为了把他填满,我们初始化是为了。
2024-09-27 19:55:15
788
原创 动态规划算法:11.简单多状态 dp 问题_按摩师_C++
我们在状态标识的时候,一般都会创建一个数组dp,也就是我们所说的dp表,我们要做的就是把每一个状态的值填入这个表内,最终这个表内的某一个值可能就是我们要返回的值。越学越深入,动态规划也是熟能生巧,在题目中没有明显给出的时候,我们就要凭借自己做题的经验来确定,所以就需要我们大量的做题。时,我们选择了第一个预约时长,根据状态转移方程中我们求f[0]就需要f[-1],但我们没有f[-1]这个值,这就是越界。由题目我们可知,我们两次选择的预约时间不能相邻,并且题目要求我们最后的结果(预约时长)达到最大。
2024-09-25 17:08:37
1173
原创 C++ 中的继承(详细讲解)
下面我们看到Person是父类,也称作基类。Student是子类,也称作派生类。实际上面的表格我们进行一下总结会发现,基类的私有成员在子类都是不可见。基类的其他成员在子类的访问方式 == Min(成员在基类的访问限定符,继承方式),public > protected > private。意思就是,我们拿基类成员的权限与派生类继承方式的权限作比较,基类的其他成员在子类的访问方式就是较小的那个权限方式。
2024-09-19 20:15:16
2112
原创 动态规划算法:08.路径问题_下降路径最小和_C++
931. 下降路径最小和 - 力扣(LeetCode)https://leetcode.cn/problems/minimum-falling-path-sum/description/
2024-09-17 20:42:15
932
原创 C++---由优先级队列认识仿函数
本文主要介绍了优先级队列是什么,如何使用优先级队列,并且由优先级队列引出仿函数,从中认识仿函数,最后了解一下什么是适配器。在我们上面优先级队列使用时,我们想将默认大堆改成小堆,因此我们添加了额外的两个参数模板,其中控制大小堆变化的就是第三个参数greater在C++中,仿函数或函数对象是通过重载operator()的类实例来模拟函数行为的对象。这种特性使得C++的对象可以像函数一样被调用,从而为编程提供了极大的灵活性和强大的功能。仿函数是一个类,它定义了一个或多个operator()
2024-09-06 20:42:20
1150
原创 Linux---项目自动化构建工具-make/Makefile
在我们makefile文件中我们是直接从code.c生成可执行程序mytest,但是我们在上文讲过程序的编译过程,整个流程应该是code.c→code.i→code.s→code.o→mytest,那我们在makefile文件中应该怎么写呢?我们已经知道,make的工作推导规则是从上到下,生成第一个目标文件,所以mytest还是应该在第一行,mytest的依赖文件列表是code.o,那么依赖方法就是gcc code.o -o code.exe。比如:int a=0;
2024-08-16 16:49:24
766
原创 Linux---代码运行-程序的翻译过程
我们平常用C/C++语言写代码的时候,运行只是靠编译器,点一下运行按钮就会出现我们代码运行的结果,那我们的代码究竟是怎么得到最终结果的呢?还是非常值得我们去了解与学习的。
2024-06-14 17:31:46
1075
原创 Linux---Linux编译器-gcc与g++的使用
GCC是以GPL许可证所发行的,也是的关键部分。GCC的初衷是为专门编写一款,现已被大多数类Unix操作系统(如、MacOS X等)采纳为标准的编译器。
2024-06-09 19:15:21
805
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人