- 博客(75)
- 收藏
- 关注
原创 《网络基础之socket理解》
因为在服务器中,我们需要唯一确定ip地址和端口号,方便所有的用户都能找到对应的服务器,而这个相关的信息,我们可以写在相关的配置文件中,所以从用户端是一定能找到服务器的,但是从服务器的角度来说,用户端的ip是随机的,端口是随机的,我不需要去找你,也根本找不到你,也会出现端口号被占用的情况,索性不如让操作系统帮我们进行绑定,一旦进行连接,服务器这边就能记录端口号和ip地址,方便下次找到你。所以我们又设计了一套网络用API结构,我们可以了解一下:send,recv,bind,listen,connect等等。
2023-06-16 06:00:00 481
原创 三次握手四次挥手过程剖析
首先由一方发送fin信号,表示自己想要断开这个连接(在tcp协议中,服务端和客户端是对等的,谁发送fin信号都行),另一方返回ack连接表示自己收到了这个信号,在发送回一条fin信号,表示自己也要断开连接,最开始发送fin信号的一方收到之后返回ack信号,表示自己收到,并处于time_wait状态,另一方接收到ack信号后,立马关闭连接。你要把自己带入到这个网络协议里面,想象你和你的对象就是服务端和客户端,你们表白的时候的一般情况不就是,“xxx你能当我女朋友吗?通信也是有时间和空间的成本在里面的。
2023-06-10 10:23:06 658
原创 《10.21作业修正》
session服务器为了保存客户状态而创建的临时会话,或者说一个特殊的对象,保存在服务器中,将会话ID通过cookie进行传输就行,就算会话id被获取利用,但是session中的数据并不会被恶意程序获取,这一点相对cookie来说是安全了一点,但是成本是非常高昂的,需要建立专门的session集群服务器,并且这个服务器会占据大量的存储空间(需要保存每个客户端的信息)。secure:该cookie是否仅被使用安全协议传输,安全协议,安全协议有HTTPS,SSL等,在网络上传输数据前先加密,默认为false。
2023-06-06 00:30:00 416
原创 《HTTPS协议原理》
加密这玩意从概念上是真的不好陈述,等一会我去百度上去复制粘贴一句话哈,咳咳,加密就是把明文进行一系列变化,生成密文,解密就是把密文再进行一系列变化,还原成明文,在这个加密和解密的过程中,往往需要一个或者多个中间的数据来辅助这个进程,这个进行辅助的数据可以称为密钥。这玩意,具有不可逆推性,从哈希根本原理来说,你不可能从一个摘要得到这玩意的原文,除非你进行穷举,但是有人计算过,一篇一千字的文章,你想逆推,基本上需要一千多年,没啥意义主要是。私钥可以加密密文,但是就需要公钥解密,公钥加密密文,就需要私钥解密。
2023-06-03 00:15:00 1519
原创 《简单的http网站的构建》
同学们访问网页的时候,最多出现的还是404,也就是服务器无法处理请求,而不是5xx,这是为啥呢?你想想4xx是客户端错误码,客户端是使用的人的问题,而5xx是服务端,也就是服务器出了问题,抱着打死不认错的态度,当然不会说这是我服务器的错误了对吧,其实底层还有更胜一层的原因,总有一些黑客喜欢干一些破坏团结的事情,当你使用一些特殊的访问导致的服务器出错,那那些人就知道你的服务器的弱点,从而进行攻击,但是你如果返回的是4xx他们可能就不会再这个报错上多花心思了。【六】最简单的HTTP服务器。
2023-05-30 00:00:00 850
原创 4月11日作业修订
条件变量提供了一个pcb队列以及阻塞和唤醒的接口实现同步,但是什么时候唤醒以及什么时候阻塞线程是由程序员控制的,而这个控制是需要一个共享资源来决定的,所以需要搭配上一个互斥锁来进行使用来保护这个共享资源的条件判断和操作。A.这主要看你互斥锁锁的资源是那部分的,如果是进程内资源,则可以实现同一进程不同线程之间的互斥,而如果将共享内存作为互斥锁进行操作则可以实现不同进程之间的互斥。条件变量被唤醒时,需要重新进行条件判断,因为有的线程卡在锁的地方,一个线程结束后,直接进入还是会导致数据的二意。
2023-04-12 01:30:00 670 1
原创 《4月9日作业修订》
pthread_creat是一个库函数,功能是在用户态去创建一个用户线程,而这个进程的运行调度是基于一个轻量级进程实现的,上层我们能看到的是用户线程,其实在底层是一个轻量级进程。使用pthread_self 获取的是这个用户态进程的id,getid()是用来获取当前进程的id,并非某个特定的轻量级进程。主线程调用pthread_cancel()时,主线程等待其他线程运行结束,其他线程不受影响,所以这是正确的。主线程的退出并不影响到其他的线程的运行。ps -L查看轻量级进程信息。
2023-04-10 00:00:00 74
原创 《4月7日作业修订》
1.用户级线程通过线程库实现,所有的线程管理工作都由应用程序负责的,但是用户级线程在用户态下即可完成切换,无需操作系统的干预。1.linux中进程比线程安全的原因是进程有自己独立的地址空间,有自己独立的数据,具有独立性,a选项实在是过于片面。线程包含cpu现场,但是仅仅是进程中的一个执行流,执行的是程序中的一部分,多个进程保证了线程的运行。线程独有:栈,寄存器,信号屏蔽字等等,所以每个线程都有自己的栈区,但是堆区是公用的。进程是资源分配的基本单位,但是线程是调度的基本单位。
2023-04-07 20:38:33 103
原创 《图的基础概念》
注意:有向图中每条边在邻接表中只出现一次,与顶点vi对应的邻接表所含节点的个数,就是该节点的出度,但是如果你想要找到节点的入度,你必须去检查所有顶点对应的边链表,看看有多少顶点的目的值是i。使用邻接矩阵存储图的优点就是能过去快速的知道这两个顶点是否连通,缺陷是如果顶点比较多,边比较少时,矩阵中存储了大量的0成为系数矩阵,比较浪费空间,并且要求两个节点之间的路径不是很好求。联通图:在无向图中,若从顶点v1到顶点v2有路径,则顶点v1和顶点v2是联通的,如果图中任意一对顶点都是联通的,则这个图就是连通图。
2023-01-04 00:00:00 450 1
原创 《B-树》
对于一颗节点为N度为M的B-树,查找和插入需要logM-1N次进行比较,这个还是比较好证明:对于度为M的B-树,每一个节点的个数为M/2~(M-1)之间,因此树的高度应该要在logM-1和logM/2N之间,在定位到该节点之后,使用二分查找就可以定位到元素,知道为什么在这里能进行二分查找吗?以上结构适合于数据量不是很大的情况下,如果数据量是非常大的,一次无法加载到内存中,使用上述结构就不是很方便,需要多次IO。1.如果树为空,直接插入新节点中,该节点为树的根节点。tips:B-树读成b树,并不是b减树。
2023-01-02 00:45:00 326
原创 《LRU Cache》
狭义 的Cache指的是位于CPU和主存间的快速RAM, 通常它不像系统主存那样使用DRAM技术,而使用昂贵但较 快速的SRAM技术。Cache的容量是有限的,因此当cache的容量用完之后,而又有新的内容需要添加进来时,就需要挑选并且舍弃原有的部分内容,从而腾出空间来释放新的内容,LRU Cache的替换原则就是将最近最少使用的类容去替换掉,其实LRU Cache翻译成最久未使用会更加的贴合形象,因为该算法每次替换掉的就是一段时间内最久没有使用过的内容。【二】LRU Cache的模拟实现。
2022-12-30 00:45:00 176
原创 《并查集》
在一些应用问题中,需要将n个不同的元素划分为一些不相交的集合,开始时,每个元素自成一个单元素集合,然后按照一定的规律将归于同一组的集合合并,在此过程中要反复用到查询某一个元素归属于那个集合的运算,适合于描述这类问题的抽象数据类型称之为并查集。从底层上来说,并查集就是一个数组罢了,如果向取找到一个标记位的父节点的话,只需向上不断地递进,找到值小于零的标记位,这就是父节点,若想看这两个元素有没有关系,你就分别找各自的父节点,如果两者的父节点相同,就说明这两个是有关系的。1.数组的下标对应集合中元素的编号。
2022-12-28 17:26:04 467
原创 《位图&布隆过滤器》
一般来说,计算机中的集合是用哈希表来存储的是,它的好处是快速准确,缺点是废内存,当集合较小时,这个问题不是十分明显,但是如果集合是很巨大的时,哈希表存储效率是非常低下的。如果使用哈希表来存储,则需要200g左右的内存,而一般的电脑上是很难达到这样的内存规格的。布隆过滤器由布隆在布隆在1970年提出的一种紧凑型,比较巧妙的概率型数据结构,特点是高效的插入和查询,可以用来告诉你某样东西一定不存在或者可能存在,它由多个哈希函数,将一个数据映射到位图结构中,此种方式不仅可以提升查询效率吗,也可以节省大量的空间。
2022-12-28 01:00:00 530
原创 《哈希表》
桶的个数是一定的,随着元素的不断插入,每个桶中元素的个数不断增多,极端条件下,可能会导致一个桶节点非常多,会影响的哈希表的性能,因此在一定条件下需要对哈希表进行增容,那该条件怎么确认呢?研究表明:当表的长度为质数且表装载因子不超过0.5时,新的表项一定能够插入,而且任何一个位置不会被探测两次,因此只要表中有一半的空位置,就不会存在表满的问题,在搜索时可以不考虑表装满的情况,但在插入时必须确保表的状态因子不超过0.5,如果超出必须要进行增容,所以比散列的最大缺陷就是空间利用率低,这也是哈希的缺陷。
2022-12-27 02:00:00 1345
原创 《二叉平衡树(一)》
二叉搜索树虽然可以缩短查找的效率,但如果数据有序或者是接近有序二叉树就会退化为单只树,查找元素相当于在顺序表中查找元素,效率低下,因此俄罗斯两个大佬数学家G.M.Adelson-Velskii和E.M.Landis在1962年 发明了一种 解决上述问题的方法:当二叉搜索树插入新节点后,如果能保证每个节点的左右子树高度之差的绝对值不超过1(需要对树中的节点进行调整),就可以降低树的高度,从而减少平均搜索长度。插入和删除操作,也都是建立在查找的基础上的,那么二叉搜索树的查找效率是多少呢?
2022-12-23 19:54:05 496
原创 《MySQL索引事务》
脏读问题:事务a在对某个数据进行修改时,修改的时候,事务b去读取了这个数据,此时事务b读到的可能是一个“脏数据”(这个数据是一个临时的结果,而不是最终的结果),出现了脏读的问题,原因就是事务和事务之间,没有进行任何的隔离,加上了一些约束限制,就可以有效地避免脏读问题。处理脏读:给写操作加锁!在修改的过程中,别人不能读了(加锁的状态),等改完之后,别人才能读(解除加锁),我和我室友说现在别抄,等我去给老师检查完了之后,你们再抄,一旦加上这个写锁之后,意味着事务之间的隔离性就高了,并发性就降低了。
2022-12-17 00:08:32 616 1
原创 《MySQL的条件查询》
select中使用group by子句可以对指定列进行分组查询,需要满足:使用group by 进行分组查询时,select指定的字段必须是“分组依据字段”,其他字段若想出现在select中则必须包含在聚合函数中。 等于,NULL安全,NULLNULL的结果是true。这比删库还麻烦,删库起码还能有备份,但是你这个修改是找不到原来的数据。
2022-12-15 15:53:06 1525
原创 《MySQL的基础语法》
数据库服务器会遍历表中的记录,依次带入到条件中,如果条件成立,则这个记录被保留下来,如果条件不成立,则直接跳过。删除:delect from 表名 where 条件 一定要保证where的条件是正确的,如果没有where就会删除掉整个表的数据。drop table 表名 where 条件:一定要保证where的条件是正确的,如果没有where就会删除整个表的数据。修改:updata 表名 set 列明=值......where条件:此处的修改是针对“满足条件”的记录进行的。
2022-12-13 17:00:50 391
原创 《数据在外设中的存储》
【一】磁盘的物理结构 我们现在很少看到磁盘了,我们电脑使用的大部分使用的是nvme协议的固态硬盘,差一点的使用的是sata固态接口的硬盘了,磁盘在我们电脑上尤其是笔记本电脑上是很少存在的,难道磁盘真的穷途末路了吗?显然不是,在企业端,磁盘依旧是主流,这是为什么呢?因为出于成本和稳定性考虑。 相同容量的固态和磁盘,固态的价格要比磁盘高上三倍以上,且固态是一个电子元器件,如果遭受到了不可逆的损伤,数据恢复的可能性为0,且长时间断电的情况下,固态内的数据会出现短暂丢失且不能恢复的情况,
2022-12-06 00:41:20 310
原创 《vector和list 的对比》
扩容的时候,会将原本的空间丢弃,然后开辟出一块新的空间,这样就会造成计算机额外的消耗,且开辟的空间大小无论是原本的两倍,一点五倍或者其他,都会存在一定的空间浪费,如果你开始数据小的,浪费的并不是十分明显,如果当数据量达到一定的时候,你就会发现,你开辟两倍的空间,是非常多余的。因为内存空间是连续的,当cpu告诉缓存加载数据的时候,是加载一部分的空间,不仅仅是你需要的一块数据的空间,所以你访问时,你加加的时候,不需要重新加载一块新的空间,这也就节省了很多时间和提升了程序运行的效率。2.cpu高速缓存命中率低。
2022-12-02 12:14:09 1277
原创 《缓冲区的理解》
你想想,一份数据从cpu寄存器内计算出来,然后需要将这份数据输入到磁盘中,无非有两种方式,一种是直接从cpu内部向磁盘写入,一种是先写入到内存中,然后由内存向磁盘中写入。其实明眼人都能看出来,第一种方式的速度是十分缓慢的,因为相比于cpu的输出速度,磁盘的写入速度是非常慢的,这也就会导致电脑这个设备总体的运行速度变慢,这就是著名的木桶效应,所以由cpu向内存中写入,再由内存打包后同意写入到磁盘中,这种中间虽然多出了一个中间商,但是这种方式确实我们最快的选择了。b.行刷新——行缓冲——显示器——给人看的。
2022-11-29 15:14:41 424
原创 《基础IO》
表示一个已经打开的文件对象,而执行open系统调用,所以必须让进程和文件关联起来,每个进程都有一个*files,指向一个files_struct,该表最重要的部分就是保函一个指针数组,每个元素都是一个指向打开文件的指针!历其实就是c的库函数会自带缓冲区,而系统调用没有缓冲区,当你fork之后便出现了两份代码和两份数据,缓冲区中的数据会直接输入到文件中,但是系统调用的数据本就直接输入到了文件,缓冲区中就不存在了,这也就是出现了一个输入的原因。所以f#系列的函数都是对系统调用的封装,方便我们进行二次开发。
2022-11-27 16:55:08 387
原创 《Linux进程控制》
替换原理:用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序,当进程调用一种exec的函数时,该进程的用户空间代码和数据是完全被新程序替换,从新程序的启动历程开始执行,调用exec并不创建新进程,所以在调用exec前后该进程的id并没改变。非阻塞的等待方式就是在这个进程在等待的时候,发生了进程跳跃,cpu去处理其他的进程了,阻塞的进程状态就是,cpu一直在处理这个进程,没有去管其他的进程。a)非阻塞的等待方式。
2022-11-27 14:46:29 212
原创 《Linux下的进程创建》
返回值:fork函数的返回值是非常有意思的,他是有两个返回值的,对于父进程来说,返回值是子进程的id,对于子进程来说,返回值是0,但是如果子进程创建失败则返回-1.这就是关于这期所有的进程的内容,如果有什么遗漏或者有问题的地方,还请移步于评论区交流,如果觉得写的还不错的话,还请一件三连,毕竟码字不易。在Linux中fork函数是非常重要的,他从已存在的进程中创建一个新进程,进程为子进程,而原进程为父进程。1.之前说过,子进程退出,父进程退出,父进程如果不管不顾,就可能造成僵尸进程的问题,进而造成内存泄漏。
2022-11-15 23:31:54 303
原创 《进程地址空间》
我们需要读取内存空间的内容的时候,我们会先去虚拟地址空间去找相应的虚拟的地址,然后到页表中按照虚拟的地址寻找到物理地址,根据物理地址寻找到相应的内存,然后将内存中存储的数据加载到相应的进程中,这也就能解释上面的现象发生的原因了,因为我们父进程和子进程都有自己的页表,所以虚拟地址是可以相同的,但是在物理地址中,父进程和子进程都是有用自己的一块空间,所以存储的内容是不相同的。这就需要一个中间的媒介叫做,页表,你可以简单的把页表理解为左边存储的是虚拟地址,右边存储的是物理地址,右边和左边的地址一一对应,
2022-11-13 13:10:18 141
原创 《进程状态》
一个CPU只能有一个运行队列,本质上进程都是以链表的形式将结构体对象放入运行队列中,让进程pcb在runqueue,就是R,所以并不是这个进程在运行就是运行状态,且不要以为你的进程只会占用你的CPU资源,你的进程,也可能随时随地要外设资源。阻塞状态:其中一个很重要的外设就是磁盘,因为磁盘的不管是上传还是加载速度都是很慢的,而且各个进程或多或少的都要去访问他,这个时候就排起了队,然后挨个访问磁盘,这个时候这些进程就叫做阻塞进程。所谓的进程不同的状态,本质上就是进程在不同的队列中,等待某种资源。
2022-11-06 10:19:20 572 2
原创 《进程的概念(一)》
以上就是关于进程的浅析,如果写的有问题还请位于评论区斧正,如果没问题的话,还请一件三连,点点关注。负数:如果出错,则fork()返回-1,此时没有创建新的进程,最初的进程任然运行。内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针。这个手册告诉我们folk是用来创建一个进程的,且目前这个进程是他的父进程。进程信息被放置在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。I/O状态信息:包括现实的I/O请求,分配给进程的和被进程使用的文件列表。
2022-10-30 20:34:42 340 1
原创 《Linux调试器-gdb使用》
以上就是关于gdb下调试的命令指示,如果有问题的还请在评论区斧正,觉得本人说的还不错的话还请一键三连,比较码字不易,还请给给关注。list/l 行号:现实binFile源代码,接着上次的位置往下列,每次列10行。3.要使用gdb调试,必须要在源代码生成二进制程序的时候,加上了-g选项。print/p:打印表达式的值,通过表达式可以修改变量的值或者调用函数。display +变量名:跟踪查看一个变量,每次停下来都显示他的值。list/l +函数名:列出某个函数的源代码。info break;
2022-10-29 22:43:25 308 1
原创 《vim的基础使用》
答:命令模式的意义就是极大的提高编写效率,有的人就要问了,vim模式下代码那么难写,为何还能提升代码的编写效率,因为你想想你有时候一个c语言文件很长,一万行,你在vs的条件下编写,你需要翻到最后,你是不是就很难搞,滑鼠标滚轮都划半天,但是你在vim中就简单的使用一个命令即可。gcc -E wu.c -o wu.i 从现在开始,进行程序的编译,当你预处理做完,就停下来,且将文件生成的文件导入wu.i中。1.vim的配置,是一人一份的,一个用户的配置的配置是自己的,不影响别人!
2022-10-23 19:58:36 362
原创 《C++ STL介绍和String类的初阶》(仅做了解)
C语言中,字符串是以‘\0’结尾的一些字符串的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分开的,不太符合OPP的思想,而且底层空间需要用户自己管理,稍不留神可能面临越界访问。是在惠普实验室完成的初始版本,本着开源精神,他们声明允许任何人任意拷贝,运用,拷贝,修改,商业使用这些代码,毋须付费,但是唯一的条件就是也需要像原始版本做开源处理,HP版本,所有STL库的祖宗。c.string类是使用char作为他的字符类型,使用他的char_traits和分配器类型。
2022-10-23 00:27:34 358
原创 《C++内存管理结尾和模板》
什么是内存泄漏:内存泄漏是指因为疏忽或者错误造成程序未能释放已经不在使用的内存的情况,内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为程序涉及错误,失去了对该段内存的控制,因而造成了内存的浪费。类模板实例化与函数模板实例化不同,类函数实例化需要在类模板名字后面跟上,然后将实例化的类型放在中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。1.重载的函数仅仅是类型的不同,代码重复的利用率比较低,只要有新的类型出现时,就需要维护自己增加对应的函数。
2022-10-18 16:03:27 519 1
原创 《Linux下软件的管理》
在Linux下安装软件,一个通常的办法就是下载程序的源代码,并经行编译,既可得到可执行程序,但是这种办法属实是太麻烦了,因为下载要时间,编译要时间,可能有的小伙伴认为编译是一件很简单的事情,因为我们写的代码基本上按下F5后基本上三秒就能编译完成,但是对于一个普通软件来说,编译这件事属实是耗费世间,基本上都是三小时起步。在命令模式下,shift+;就会进入地行模式,输入不同的命令行,就会有不同的结果。vim在是一个多模式的编辑器,目前有13种编译模式,我们日常能用到的只有三种,正常模式,插入模式,末行模式。
2022-10-16 23:20:08 318 1
原创 《C++内存管理》
new和delete是用户进行动态内存申请和释放的操作符,operator new和operator delete是系统提供的全局函数,new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局函数来释放空间。realloc将原有的空间扩容,如果原空间足够,就在原地址上扩容,如果原有的空间地址不太够,那么就另找一块空间开辟出相应的大小,再将原有的空间的数据拷贝到这个空间上来,然后释放原有空间。calloc开辟出空间,并将开辟出的空间初始化为0。
2022-10-16 01:45:00 401
原创 《C++的类和对象后解》
比如Time类和Date类,在Time类中声明Date类为其友元类,那么可以在Date类中直接访问Time类的私有成员变量,但想在Time类中访问Date类中私有的成员变量则不行。概念:如果一个类定义在另一个类的内部,这个内部类就叫做内部类。内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去访问内部的成员,外部类对内部类没有任何优越的访问权限。注意:内部类就是外部类的友元类,参见友元类的定义,内部类可以通过外部类的对象参数来访问外部类中的所有成员,但是外部类并不是内部类的友元。
2022-10-15 03:30:00 338
原创 《C++类中拷贝构造函数及赋值运算符重载》
答案是否定的,只能拷贝出那个申请出的头指针,且使用析构函数析构的时候,会出现二次析构的情况。7.原因:赋值运算符如果不显示实现,编译器会生成一个默认的,此时用户在类外自己实现一个全局的赋值运算符重载,就和编译器中生成的默认运算符重载冲突了,所以赋值运算符重载只能是类的成员函数。C++为了增强代码的可读性引入了运算符的重载,运算符重载是具有特殊函数名的函数,也具有其返回值的类型,函数名字以及参数列表,其返回值与参数列表与普通的函数类似。1.拷贝构造函数是构造函数的一个重载形式(因为都是用来初始化类的)。
2022-10-11 16:03:46 695
原创 《C++类中的基本常识》
即:C++编译器给每个“非静态的成员函数增加了一个隐藏的指针参数this,让该指针指向当面对象(函数运行时调用该函数的对象),在函数体中所有的“”成员变量”的操作,都是通过该指针去访问。正常情况下,在类中函数编写的时候就会出现一个非常尴尬的问题就是,我们参数名和类中名字是相同的,这个时候就会出现一个特别尴尬的问题,就是我们傻傻分不清这个这个成员是这个本身类中的还是参数类中的,这个时候C++中通过引入this指针在解决这个问题。默认成员函数:用户没有显示显现,编译器会生成的成员函数称为默认成员函数。
2022-10-11 00:47:03 337 1
原创 《Linux权限》
其实这个还是比较好理解的,就是在对应的位置上 1表示有此项权限0表示无此项权限 然后转化为二进制,再将二进制转化为八进制。说明:将现有的存取权限减去权限掩码后,即可产生建立文件时预设权限。ii.写(w):write对文件而言,具有修改文件内容的权限;iii.执行(x):execute对文件而言,具有执行文件的权限;i.读(r):Read对文件而言,具有读取文件内容的权限;tips:超级用户的命令提示符是“#”,普通用户的命令提示符是“$”。文件和文件目录的所有者所在的组的用户:g--Group。
2022-10-09 23:06:24 203
原创 《Linux基本常识的介绍》
首先是免费,作为一家商业企业,坑定是想将利润最大化,能不出钱就不出钱,这点linux做的很好,因为他是开源的,所以这个是免费的,其次也是因为这个是开源的,所有的源代码是清晰可见的,这也就是意味着安全性得到了极大的提高,不会出现一种叫做“后门”的东西,这也就为企业的数据得到了极大的保证。2.使用虚拟机软件,将Linux搭建在虚拟机上,但是由于当前的虚拟机软件(如VMWare之类的)会存在一些莫名奇妙的bug,比较折腾,这个环境搭建的方式本人前面的文章有具体的操作步骤,大家有兴趣可以去看看。
2022-10-02 15:16:01 597
原创 《C++析构函数及其拷贝构造函数和运算符重载》
析构函数:与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作也是由编译器完成的,而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作。前面我们知道了函数的重载,这里我们又看到了运算符的重载,其实他的原理和函数的重载是一样的,有具体的函数名和其参数列表,其返回值类型和参数列表和普通的函数类似。tips:注意在编译器生成默认的拷贝构造函数中,内置类型是按照字节方式直接实现的拷贝的,而自定义类型是调用其拷贝函数完成拷贝的。5.编译器生成的默认析构函数,对自定义类型成员调用它的析构函数。
2022-09-24 16:52:56 701
原创 inline函数和C++语言的类的认识
inline对于编译器而言只是一个建议,不同编译器关于inline实现的机智也可能是不同的,一般建议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现),不是递归,且频繁调用的函数采用inline特性。底层原理:这东西有点像#define定义的函数,直接在相同的地方直接替换,却也解决了宏函数的缺点(不能调试,没有类型安全检查,容易写错),其缺点也是很明显的,就是会导致目标文件的变大,从而造成空间的浪费。C语言是面向过程的,关注的是过程,分析出问题的步骤,通过调用函数逐步解决问题。
2022-09-21 16:42:54 371
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人