学习笔记
文章平均质量分 86
月半木斤
这个作者很懒,什么都没留下…
展开
-
什么是哈希?哈希的模拟实现
这篇文章将带你从小白的角度逐步理解哈希的概念,哈希中的问题,以及解决方式,最终将带你实现个自己的哈希数据结构。还不快进来看!!!原创 2022-06-07 00:05:02 · 4026 阅读 · 8 评论 -
【C++】之多态最最最详细讲
目录 1.什么是多态? 2.多态的分类 2.1.静态多态(也可以称为:静态绑定||早绑定) 2.2.动态多态(也可以称为:动态绑定||晚绑定) 3.C++中动态多态的实现条件 4.多态的体现 5.什么是重写 测试各种情况下是否构成重写: 大总结一下构成重写的具体需求。 重载,重写,重定义三个概念的区分 6.override关键字: 7.final关键字 final使用需要注意的点: 8.抽象类 8.1.抽象类的意义 8.2.纯虚函数要注意的..原创 2022-05-21 23:01:57 · 1132 阅读 · 3 评论 -
【C++】动态内存管理
目录1.new和delete2.new和delete在底层是怎么实现的:2.1new底层的实现:2.2delete底层的实现:2.3new []底层的实现:2.4delete []的实现:3.重载new和delete4.定位new:1.new和deleteC语言内存管理方式在C++中可以继续使用,但有些地方就无能为力而且使用起来比较麻烦,因此C++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理 这里在动态申请和释放时一定要匹配原创 2022-03-29 00:16:27 · 1762 阅读 · 3 评论 -
【C++】模板
目录1.什么是函数模板:2.模板的使用3.模板的规则:4.模板函数5.模板特化6.类模板特化6.1全特化:6.2偏特化:7.类模板的应用:8.模板的分离编译1.什么是函数模板:在实际应用中我们可能会对不同类型的对象实现同一种类型的运算,如果我们用函数重载将函数参数设置为不同类型其实也可以实现,但是这无疑会让代码的复用率变低,所以在C++中就推出了模板。函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。原创 2022-03-28 23:50:57 · 495 阅读 · 3 评论 -
【C++】深度刨析构造函数-让你对构造函数有全新认识的一篇文章
1.构造函数体赋值在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值, 虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能将其称作为类对象成员的初始化,构造函数体中的语句只能将其称作为赋初值,而不能称作初始化。因为初始化只能初始化一次,而构造函数体内可以多次赋值。2.初始化列表初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。以下形式: 当然我们的拷贝构造函数也是构造函数,那么原创 2022-03-28 00:57:12 · 1114 阅读 · 0 评论 -
【C++】类和对象
1.this指针: 1.1什么是this指针: 我们在调用类中的成员函数时,this指针起的作用是功不可没的,它是每个类中的成员函数的第一个隐形形参。负责将当前调用函数的对象的地址传入。 1.2this指针存在哪里 1.3this指针可以为空吗? 理论上this指针是不可以为空的,因为你指向一个对象的地址然后对这个对象中的成员变量进行操作,但是我们透过现象看本质,类中的函数其实是存在代码区的,因为在计算类的对象的大小时,并不会将函数的大小也算进去,所以我们可以这样理解原创 2022-03-27 09:43:58 · 977 阅读 · 0 评论 -
深度刨析为何要内存对齐
目录1.当不进行内存对齐时对变量进行访问 2.如果我们采用内存对齐3.总结:我们先来模拟一个场景,这里我们定义一个结构体类型,再定义一个结构变量x。#include<stdio.h>struct A{ char a; int b; short c;}int main(){struct A x;return 0;}1.当不进行内存对齐时对变量进行访问 当我们...原创 2022-03-25 11:09:05 · 4197 阅读 · 5 评论 -
进程间通信之---消息队列
目录 消息队列 1.消息队列的原理 2.消息队列的接口: 2.1创建消息队列 2.2向消息队列发送消息 2.3接收消息: 2.4操作消息队列的接口 2.5代码测试: 信号量: 信号量的原理 消息队列 1.消息队列的原理 1.1 msgqueue采用链表来实现消息队列, 该链表是由系统内核维护, 1.2 系统中可能有很多的msgqueue, 每个MQ用消息队列描述符(消息队列ID: qid) 来区分,qid是唯一 的,用来区分不同的MQ..原创 2022-03-19 22:58:37 · 3464 阅读 · 7 评论 -
进程间通信之---共享内存
目录 共享内存: 1. 共享内存的原理 2.共享内存的接口 2.1创建或者获取共享内存接口 2.2将共享内存附加到进程的虚拟地址空间 2.3分离 2.4操作共享内存接口 3.共享内存代码 4.共享内存的特性 共享内存: 1. 共享内存的原理 1.1 在物理内存当中开辟一段空间 1.2不同的进程通过页表将物理内存空间映射到自己的进程虚拟地址空间当中 1.3不用的进程通过操作自己进程虚拟地址空间当中的虚拟地址,来操作共享内存 ..原创 2022-03-19 22:24:51 · 1039 阅读 · 6 评论 -
进程间通信之---管道
1.为啥需要进程间通信呢? 1.1原因: 每一个进程的数据都足存储在物理内存当中,进程通过各自的进程虚拟地址空间进行访问,访问的时候,通过各自的页表的映射关系,访问到物理内存。从进程的角度看,每个进程都认为首己拥有4G的空间,至 于物力内存当中属于如何存储,页 表如何映射,进程是不清楚。 这 也造就了进程的独立行。 1.2进程独立性: 好处:让每- -个进程在运行的时候,都是 独立进行运行的,数据不会窜。 坏处:如果两个进程之间需要数据交换,那么由于进程独立行..原创 2022-03-19 21:59:10 · 1549 阅读 · 4 评论 -
Linux下文件系统
数据处理是计算机最主要的功能,显然对于数据的存储也是十分重要的,今天这篇文章将带你简单的了解一下在Linux操作系统下的文件系统是怎样构成的。首先我们先来解释一下bash命令行所显示的内容都是什么意思:...原创 2022-03-19 21:26:51 · 1966 阅读 · 4 评论 -
静态库&动态库
目录1.1静态库&动态库1.1什么是库:1.2动态库1.2.1特征:1.2.2生成:1.3静态库1.3.1特征:1.3.2生成:1.1静态库&动态库 1.1什么是库: 静态库和动态库都是程序代码的集合。一 般为了方便将程序提供给第三方使用,就是将程序编写成为库文件提供给第三方(用户)使用,那为什么将程序编写成库文件就不会泄漏源码了呢。这是因为将程序编写成库文件就会变成二进制的形式,而二进制的形式十分难破解。 好处: 不会泄漏公原创 2022-03-16 21:31:54 · 1395 阅读 · 3 评论 -
基础-IO
目录1.文件描述符1.1文件描述符就是一个小正数,没有复数1.2文件描述符的分配规则1.3文件描述符在操作系统内核task_struct中是什么2.文件流指针(struct _IO_FILE)3.读写缓冲区的问题4.文件流指针和文件描述符之间的关系5.重定向5.1重定向的符号5.2重定向的接口5.3从内核的角度理解重定向1.文件描述符1.1文件描述符就是一个小正数,没有复数我们通过打开一个文件,然后查看/proc/[pid]/fd文件下.原创 2022-03-16 21:33:15 · 875 阅读 · 3 评论 -
老师教你C语言下文件接口了吗?没教还不进来学
1.fopen: FILE *fopen(const char *path, const char *mode); path :带有路径的文件名称,(如果不带有路径,打开的文件可以是在当前路径下) 返回值: 成功:返回文件流指针 FILE* 失败:返回NULL 文件打开方式 r 只读模式打开 文件流是指向了文件起始位置 如果找不到要打开的文件则报错返回 r+ 以可读可写的方式打开 文件流是指向了文件起始位置..原创 2022-03-16 18:24:47 · 660 阅读 · 0 评论 -
错误码errno和perror函数
1.错误码errno1.1作用:errno是系统中的一个错误码,当我们调用一个函数出错的时候,如果该函数出错了就会将errno赋值成为相应的错误码(整型)。一个错误码对应一个错误信息errno->error msg,但是通过这个错误码我们肯定也无法知道该错误信息,所以它一般由perror函数获取,进行打印错误信息。2.perror函数2.1作用:将error msg打印出来,会直接拿errno...原创 2022-03-15 20:46:33 · 5643 阅读 · 0 评论 -
进程程序替换
1为什么要进程替换 因为父进程创建出来的子进程和父进程拥有相同的代码段,所以,子进程看到的代码和父进程是一样的。当我们想要让子进程执行不同的程序时候,就需要让子进程调用进程程序替换的接口,从而让子进程执行不一样的代码 举个实例:像牛客网这些刷题网站他在接收你写的程序时就会创建一个子进程,让子进程去执行你的代码,这样即使你的代码写的有问题那也是子进程崩掉了。 2原理 替换进程的代码段和数据段,更新堆栈。 3 exec函数簇 1. int execl( c...原创 2022-03-15 09:31:20 · 708 阅读 · 4 评论 -
进程控制-解决僵尸进程
1.进程终止 2.1进程终止的场景 代码运行结束,结果正确;好比点外卖,点上了,送来点的外卖。 代码运行结束,结果不正确;好比点外卖,约上了,但是送错了。 代码异常终止;好比点外卖,点都没点上。 2.2正常终止(可以通过“ echo $?查看进程退出码) : 从main函数当中的return返回 并不是所有函数的return都能结束进程,只有main函数的return才能结束进程。 调用exit函数(库函数) 看到函数先man 可.原创 2022-03-15 08:40:30 · 2069 阅读 · 1 评论 -
关于fork函数你不知道的一些小细节
1、fork在创建子进程的时候完成的事情: 1.1创建子进程,子进程拷贝父进程的PCB。 1.2分配新的内存块和内核数据结构(task_ struct) 给子进程 1.3将父进程部分数据结构内容拷贝至子进程, 只是拷贝部分,例如子进程的PID进程号就是自己的,并不是拷贝于父进程。 1.4添加子进程到系统进程列表当中,添加到双向链表当中 1.5fork返回,开始调度器(操作系统开始调度)调度。 2、用户空间&内核空间 我们用...原创 2022-03-13 10:11:53 · 1628 阅读 · 0 评论 -
进程虚拟地址空间
目录1进程虚拟地址空间1.1 C语言当中的程序地址空间图(32位操作 系统为例)2.虚拟地址2.1奇怪的现象:2.2进程虚拟地址空间2.2.1什么是虚拟地址:2.2.2为什么要有虚拟地址空间5.页表5.1、页表是如何工作的5.2如何通过虚拟地址+页表的方式找到具体的物理地址5.3那么fork创建子进程的时候会不会拷贝页表?6、内存空闲问题6.1什么是内存空闲问题6.2.解决办法:离散分配 1进程虚拟地址空间 1.1 C语言当中的原创 2022-03-12 22:46:09 · 1138 阅读 · 3 评论 -
Linux中环境变量
1.什么是环境变量 环境变量是指在操作系统中用来指定操作系统运行的一些参数;换句话说,操作系统通过环境变量来找到运行时的一些资源。 例如: 链接的时候,帮助链接器找到动态库 (标准库的) ; (用户自己编译的动态库需要自己指定环境变量) 执行命令的时候,帮助用户找到该命令在哪一个位置, 例如ls,ldd 2.常见的一些环境变量: 2.1PATH: 指定可执行程序的搜索路径,程序 员执行的命令之所以能找到,这个环境变 量起到的作用(汗马功劳),可...原创 2022-03-12 18:43:31 · 3744 阅读 · 4 评论 -
fork函数创建子进程&僵尸进程&孤儿进程详讲
1、创建子进程 1.1 fork() 首先他是一个系统调用函数 作用:谁调用fork函数,调用成功之后,谁就创建出来一个子进程。 1.2fork()的返回值 创建成功: fork会返回两次在父进程中返回一次,在创建的子进程中返回一次。 >0返回给父进程(返回子进程的pid) ==0返回给子进程 创建失败: 返回-1 1.3、fork的原理 子进程拷贝父进程的PCB 父子进程代码共享(父子进...原创 2022-03-11 19:29:46 · 2965 阅读 · 2 评论 -
Linux下版本管理工具:git的使用(保看保会)
1、克隆仓库1.1命令git clone xxx2、提交到本地仓库2.1、命令git addgit commit -m "log"3、提交到远端仓库3.1、命令git push4、将远端仓库内容更新到自己仓库4.1、命令git pull5、git satus...原创 2022-03-08 11:14:10 · 1384 阅读 · 0 评论 -
C语言-位段
1、什么是位段C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为位段。利用位段能够用较少的位数存储数据。2、位段在使用中需要注意的一些点:1、位段的内存分配2)位段占的二进制位数不能超过该基本类型所能表示的最大位数,即位段不能跨字节存储,比如在VC中int是占4个字节,那么最多只能是32位;1. 位段的成员可以是 int unsigned int signed int 或者是 char (属于整形家族)类型。2. 位段的空间上是按照需要以4个字节( in原创 2021-11-18 16:44:10 · 3793 阅读 · 8 评论 -
c语言动态内存管理
malloc和freeC语言提供了一个动态内存开辟的函数: void* malloc (size_t size);这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。 如果开辟成功,则返回一个指向开辟好空间的指针。 如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。 返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。 如果参数 size 为0,malloc的行为是标准是未定义的,(原创 2021-11-11 17:04:07 · 1050 阅读 · 1 评论 -
c语言学习笔记
首先最重要也是学好c的最关键的一点:一定要多练习!只有勤加练习才能将所学的真正的转化为自己的东西。还有看到自己亲手写的代码跑起来的那种快感不亚于一把王者胜利带来的快感。要使程序跑起来第一步就是要先熟悉自己所用的操作环境。这里建议大家使用Visual Studio 2013(毕竟是微软的软件),...原创 2021-05-23 18:25:24 · 156 阅读 · 1 评论