自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(36)
  • 收藏
  • 关注

原创 HTTP的强制缓存和协商缓存

由于协商缓存每次都需要向服务端询问资源是否过期,所以协商缓存适合资源经常修改的情况来使用。强制缓存设置了一个过期时间,过期时间内强制使用本地缓存的内容,过期了在作其他处理,因此强制缓存适合长时间不变化的资源。有人会有疑问?强制缓存和协商缓存是有关联性的,只有强制缓存过期了才会考虑协商缓存,那么经常修改的资源怎么实现呢?可以将max-age=xxx中的xxx设置为0,且使用 no-cache字段即可实现。

2024-04-07 16:23:09 940 1

原创 浮点数在内存中的存储【详解】

IEEE 754规定: 对于32位的浮点数,最高的1位是符号位S,接着的8位是指数E,剩下的23位为有效数字M。比如,2^10的E是10,所以保存成32位浮点数时,必须保存成10+127=137,即10001001。所以这里是float类型,E=-1,存储时加上127,也就是真正存入内存的是:-1+127=126。我们会发现一个特别的现象,E=-1,前面说过,E是一个无符号整数,那这个-1该怎么存储呢?对于64位的浮点数,最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M。

2024-04-07 12:44:20 667 12

原创 HTTP详解及代码实现

HTTP超文本传输协议URL简述状态码常见的状态码请求方法请求报文他们两个的作用都是为了获取指定资源或是对指定的资源做出处理,如果请求方法为POST,则参数在Body中,如果请求方法为GET,则参数在URL中,具体细节本文不做展开解释。对于HTTP/3.0(基于QUIC),虽然它是基于UDP的,但它主要是为了解决传统TCP在性能上的一些限制而设计的,并不是为了直接支持多点传输。在计算机发展初期,计算机只能传输使用文本数据,随着技术发展,出现了图片,视频,音频,超链接等,这些数据就可以统称为。

2024-04-06 21:16:44 1173 6

原创 动态规划之解码方法【LeetCode】

这个代码不能让dp[i]也就是dp[2]有任何变化,因为dp[i-2]也就是dp[0]被初始化为0了,但是应该使得dp[i]也就是dp[2]加上1的。如果s[i]和s[i-1]合并为一个字符形成为一个数字,那么dp[i]的值就是dp[i-2]的值。因为s[i]和s[i-1]都形成一个数字了,再dp[i]往前就是就是dp[i-2]了。我们可以可以将解法1中的dp数组整体向右移动一个元素的位置, 解题思路和解法1一样,如此一来我们只需要初始化新增加的dp[0]和dp[1](解法1中dp数组的dp[0])。

2024-02-28 20:55:16 1057 11

原创 动态规划之使用最小花费爬楼梯【LeetCode】

根据题意,我们需要知道到达第1层和第2层台阶的最低花费,第1层和第2层台阶的最低花费为0,并且vector会自动将所有元素初始化为0,所以可以忽略这一步。:当我们求解当前问题时,需要知道所需较小子问题的解,这就需要我们先求解得到较小子问题的解,这就是填表顺序。:当我们求解当前问题时,需要知道所需较小子问题的解,这就需要我们先求解得到较小子问题的解,这就是填表顺序。):dp[i]表示以第i级台阶为楼层顶部,到达第i层台阶的最低花费。):dp[i]表示从第i级台阶开始,到达楼层顶部的最低花费。

2024-02-28 20:54:58 468 7

原创 动态规划之第 N 个泰波那契数/三步问题【leetCode】【算法】

第 N 个泰波那契数/三步问题【leetCode】通过上图我们容易看出来,每次求解的时候,我们只需要知道前面的三个值即可,但是求解1中我们使用了一个数组,这就浪费了我们得空间,我们优化就可以从这方面入手。状态表示为:dp[i]表示到达第i个台阶的方式数量。将三种方式相加,就是总的到达第4个台阶的方式数7种。则我们经过第3个台阶到达第4个台阶的方式数有4种。经过第2个台阶到达第4个台阶的方式数有2种。经过

2024-02-26 23:30:53 1082 15

原创 进程间通信之共享内存及其shm函数的使用【Linux】

共享内存区是最快的IPC(Inter-Process Communication,进程间通信)形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据.匿名管道和命名管道都需要通过系统调用接口来实现进程间通信,因为管道属于文件,属于内核中的一种特殊数据结构,由OSweihu,所以只能使用系统调用。而共享内存存在堆栈之间,可以直接读写。双方进程若要进行通信,直接进行内存级的读写即可。共享内存的提供者是操作系统。

2024-01-07 15:23:52 1655 12

原创 进程间通信之匿名管道和命名管道的理解和实现【Linux】

管道是进程通信的其中一种,管道分为两种:fill:#333;color:#333;color:#333;fill:none;管道匿名管道pipe命名管道管道是Unix中最古老的进程间通信的形式。我们把从一个进程连接到另一个进程的一个数据流称为一个“管道”。管道只能单向通信。父进程fork之后,父进程会copy一份files_struct给子进程,但是父子进程的文件描述符依旧是指向同一份文件,而这个文件就叫做管道。

2024-01-06 23:49:55 916 1

原创 【详解】静态库和动态库的认识和使用【Linux】

静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接(dynamic linking)

2024-01-06 11:59:18 1513 13

原创 硬链接和软链接以及inode的简述【Linux】

里面有一部分叫做inode Table.里面存放着一个个的inode,一个inode里面包含一个文件的属性,每一个inode都有一个inode编号。创建硬链接是在文件系统中创建一个指向目标文件的硬链接,硬链接与目标文件共享相同的 inode 和数据块,它们在文件系统中被视为同一实体,即使使用不同的文件名。通过inode中的指针或引用,操作系统可以定位到文件的数据块。答:因为inode和Data blocks的空间是固定的,不能保证两个同时有空间,若inode满了,Data blocks有空间,还是会失败。

2024-01-05 22:08:54 1105 1

原创 FILE* 和文件描述符及其相互转换【系统编程】

开始之前先来介绍使用系统接口open来打开一个文件的流程:open -> 从PCB也就是task_struct中找到files指针 -> file指针指向结构体files_struct -> files_struct中有一个重要的部分是fd_array[]数组,里面包含一个file指针 -> 通过这个file指针就可以指向一个file结构体 -> 这个file结构体中含有文件的所以信息,于是就找到了相应的文件。,当使用FILE是就能通过文件描述符找到底层的file结构体,获取文件信息。

2024-01-05 13:52:38 827 4

原创 进程的程序替换(exec函数)【Linux】

进程的程序替换详解exec函数【Linux】程序替换的原理exec系列函数函数理解命令理解(助记)关于程序替换中环境变量的解释exec函数之间的关系数时,该进程的用户空间代码数据完全被新程序替换,从新程序的启动例程开始执行。所以我们需要添加环境变量,使用putenv()函数,使用这个函数需要注意的是,会将原来的PATH内容全部清除,然后再添加新的PATH。进程的程序替换就是让子进程执行新程序, 执行全新的代码和数据,不再和父进程有瓜葛。以下函数的参数末尾都一定需要带上一个==“NULL”==。

2024-01-04 21:43:10 1077 12

原创 在排序数组中查找元素的第一个和最后一个位置

就会导致left一直指向1,right一直指向不变,没有left

2024-01-04 14:14:57 813

原创 进程等待(wait和wait函数)【Linux】

进程等待的概念进程等待的必要性进程等待的方法wait函数waitpid函数非阻塞等待和阻塞等待的对比阻塞等进程等待的2. 由于一般来说,子进程的出现是为了协助父进程完成一些任务,子进程就像是父进程的手下小兵一样,因此子进程完成父进程交给的任务,退出后也一定要给父进程一个答复(子进程是否完成,是否出现异常等)。1. 因为父子进程的执行顺序是不确定的,可能父进程会比子进程先一步退出,此时就会让子进程成为僵尸进程,子进程已经退出,但是依旧占用着内存空间,造成内存泄漏。输出型参数,获取子进程退出状态,不

2024-01-03 17:41:04 1169 14

原创 fork函数详解【Linux】

fork函数的概念 深拷贝的策略 fork调用后的底层细节解释 fork学习中的一些笔记所以真实情况是:子进程的创建确实以父进程为模板将其内容拷贝到了子进程的内核数据结构中,但是当数据有所变化时,就以深拷贝的方式父子进程各自私有一份。看完上面这份代码,为什么明明父子进程的a是同一块地址空间的,按理来说子进程修改了a为3,父进程的a为什么还是8呢?由于虚拟内存地址和页表以及页表和物理地址空间的映射关系,父子进程此时都是一模一样的。调用fork函数可以在已存在的进程中创建一个子进程,此时,新进程。

2023-12-28 15:50:31 1471 13

原创 Linux下的环境变量【详解】

环境变量一般指的是在操作系统中用于指定操作系统运行环境的一些参数。在链接C/C++程序的代码时,会用到动静态库,但是动静态库我们并没有显示的去指定过让系统去那个路径下寻找它,但是每次都可以链接成功,这是因为有了环境变量的帮助。环境变量还会有一些特殊的用途,比如可以用作身份验证。

2023-11-10 13:01:48 6107 20

原创 哈希的开放定址法的实现【C++】

开放定址法也叫闭散列,是解决哈希冲突的一种方法,当发生哈希冲突之后,如果哈希表没有被装满(正常情况哈希表不会被装满的),那就向后移动,寻找一个没有元素的地址,然后插入。线性探测。

2023-11-03 12:32:49 301 23

原创 C++之函数重载【详解】

1. 函数重载的概念 C++支持函数重载的原理(名字修饰) 前言2.2 函数名修饰规则2.3 VS下的命名修饰规则预编译,编译,汇编,链接。C语言链接时得到的函数地址没有经过修饰,C++链接时需要经过特定的规则来修饰,函数名经过修饰后再去寻找相应函数的文件。由于Windows下的VS的函数名修饰规则复杂,重点了解下LINUX下 g++的函数名命名规则。

2023-10-23 22:40:36 382 21

原创 C++之继承<2>【详解】

1. 派生类的默认成员函数1.1 1. 构造成员函数1.2 拷贝复制1.3 构造函数和析构函数的执行顺序2. 继承和友元3. 继承与静态成员1. 派生类的默认成员函数1.1 1. 构造成员函数  派生类的构造函数必须调用基类的构造函数初始化基类的那一部分成员。如果基类没有默认的构造函数,则必须在派生类构造函数的初始化列表阶段显示调用。

2023-10-20 23:21:37 373 25

原创 C++之继承<1>【详解】

继承方式public继承protected继承private继承访问限定符public访问protected访问private访问。

2023-10-15 14:37:24 263 19

原创 词法分析中的“贪心法”

编译器分辨符号的方法是:从左到右一个字符一个字符的读入如果这个字符可能组成一个符号,那么再读入下一个字符,判断已经读入的字符组成的字符串是否可能组成一个符号,如果可能,继续读入下一个字符,重复上述判断,直到读入的字符已经不再可能组成一个有意义的符号,才停止判断。需要注意的是,除了字符串与字符常量,符号的中间不能有空白(空格符,制表符和换行符)。

2023-09-26 21:21:06 223 22

原创 两种解法解决LCR 008. 长度最小的子数组【C++】

LCR 008. 长度最小的子数组给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。

2023-09-08 23:09:08 451 20

原创 两种解法解决 LeetCode 27. 移除元素【C++】

27. 移除元素给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

2023-09-06 15:54:31 898 19

原创 C++ 之命名空间namespace【详解】

命名空间(英语:Namespace),也称命名空间、名称空间等,它表示着一个标识符(identifier)的可见范围。一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的。这样,在一个新的命名空间中可定义任何标识符,它们不会与任何已有的标识符发生冲突,因为已有的定义都处于其他命名空间中。

2023-07-21 16:25:00 9815 25

原创 【详解】C语言冷门知识点之--位段

位段(或称“位域”,Bit field)为一种数据结构,可以把数据以位的大家有没有发现,我们在声明位段的时候,如果定义的是int,那么冒号后面跟上的数字不能超过32,如果定义的是char,那么冒号后面跟上的数字不能超过8。而位域这种数据结构的缺点在于,其内存分配与内存对齐的实现方式依赖于具体的机器和系统,在不同的平台可能有不同的结果,这导致了位段在本质上是不可移植的。以上也证明了, 在VS2022上,位段分配的内存中的比特位是从右向左使用的,分配剩余的比特位不够使用时,浪费掉剩余内存,重新开辟新的空间。

2023-07-14 14:01:03 2429 39

原创 经典指针与数组笔试题——C语言

学习这片文章中的知识点,可以加深大家对指针应用的理解,让大家更能轻松知道指针在各种情况下指向那个内存地址。提个问题:loudspeaker: :`int arr[5] = {1,2,3,4,5};`我们知道数组名arr是指针,指向一块地址,只有在一下两种情况下,arr表示整个数组:* sizeof(arr); 当出现sizeof的时候arr代表整个数组,计算的是整个数组的大小,所以`sizeof(arr);`运行的结果是20.* &arr; 这里的arr表示的也是整个数组,所以取出来的是整

2023-07-11 21:52:52 1218 26

原创 【C语言】结构体大小的计算

计算机中内存大小的基本单位是字节(byte),理论上来讲,可以从任意地址访问某种基本数据类型,但是实际上,计算机并非逐字节大小读写内存,而是以2,4,或8的 倍数的字节块来读写内存,如此一来就会对基本数据类型的合法地址作出一些限制,即它的地址必须是2,4或8的倍数。那么就要求各种数据类型按照一定的规则在空间上排列,这就是对齐。这就是字节对齐。

2023-05-22 09:36:34 1163 7

原创 详解【C语言】类型转换--整型提升,算术

C语言中整型运算总是至少以缺省整型类型的精度来进行的。为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换成普通整型,这种转换称为整型提升。> 如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换成另一个操作数的类型,否则操作就无法进行。下面的层次体系成为寻常算术转换。

2023-05-14 10:25:04 2600 16

原创 二分查找法的区间判断【C语言】

📢 :当我们在写二分查找的题目的时候(这里以leetcode的,为例),常常会因为区间的选择而疑惑,是应该选择,还是,应该写成l,还是答案是都可以,这分别是区间的还是。

2023-05-01 10:07:50 1249 14

原创 c语言随机数生成(rand,srand,time)

rand函数能够生成一个随机数,因为rand函数每次都会调用srand函数来决定随机数的起始值,所以可以通过改变srand来控制随机数起始值,如果要是不主动实现srand函数的话,rand会自动调用srand函数,但是这样会导致srand的值一直不变,普遍的做法是主动实现srand,从而使得rand函数的返回值达到真正的随机。但是srand函数需要传入一个有变化的参数,这个参数就可以了使用time函数。

2023-04-21 21:07:50 1648 5

原创 C语言中关键字static的三种用法

**static**的用法有三种,分别是 **1. 静态局部变量 2. 静态全局变量,3. 静态函数**,下面我们一一介绍 :- 栈区 :存放局部变量,形式变量,临时作用的变量。特点:进入作用于创建,出了作用域销毁(还给操作系统)- 静态区 :存放全局变量,静态变量 。特点 : 创建后,直到程序结束后才销毁(还给操作系统)

2023-04-12 23:52:59 1062 7

原创 关于为什么要在链表中用malloc来分配内存

不知道有没有人和我一样,在学习链表的时候心里搞不懂为什么要用malloc来分配内存,细细想了想,是因为知道用int也可以分配内存,总觉得可以用什么可以替代malloc来进行内存分配,想了想,突然就明白了了。这不就能完全理解单链表的这段代码了吗。下面是 malloc() 函数的声明。

2023-04-11 00:37:35 1639 4

原创 关于数组越界却不会报错

数组越界是不一定报错的,系统对越界的检查是设岗检查。

2023-04-07 00:39:24 1492 4

原创 assert()函数(断言函数)

assert函数是一个宏。括号里面的表达式显示的消息的具体内容取决于特定的库实现,但至少应包括:断言失败的表达式、源文件的名称以及发生断言的行号。Assertionfailed∗expression∗file∗filename∗line∗linenumber∗在代码的开头,在包含**

2023-04-07 00:33:52 1269 1

原创 realloc的用法

realloc函数的详解(图例)。这种情况出现在与原来指针指向的地址块后面的地址没有被分配,尚且空闲,于是realloc就直接在原来地址块后面直接扩容,分配新的空间。被分配,或者后面空闲地址的大小不够时,会在重新开辟新的地址,将原来地址块中的数据复制到新的地址中,然后会自动释放原来的地址空间。这是用C语言写的对顺序表的尾插法,代码中有解释,在这里不做过多阐述。当原来指针指向的地址块后面的地址。

2023-04-04 18:32:18 4585 6

原创 【数据结构】复杂度学习

在计算机科学中,时间复杂性,又称时间复杂度,算法的时间复杂度是一个函数,它定性描述该算法的运行时间。算法效率的度量是通过时间复杂度和空间复杂度来进行描述的,时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。但是,比较的两个机器的硬件可能是不同的,一个CPU为。所以我们在学习过程中重点掌握时间复杂度,因为时间复杂度跟CPU挂钩,决定了算法执行的时间,但是CPU的发展已经接近瓶颈,所以现在的厂商致力于增加CPU的核心数,并且在平常使用中,运行速度在人们心中更为重要。

2023-04-04 10:34:48 892 4

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除