自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux项目自动化构建——Makefile

例如:hello文件是由hello.c文件通过预处理,编译,汇编,链接之后生成的文件,所以hello.c文件的变更会影响hello文件,所以说hello文件依赖于hello.c文件。在每次重新生成可执行程序前,都应该将上一次生成可执行程序时生成的一系列文件进行清理,每次清理时执行的都是相同的清理指令,这时我们可以将项目清理的指令也加入到Makefile文件当中。,我们可以使用一个特殊的标记“.PHONY”来显式地指明一个目标是“伪目标”,向make说明,不管是否有这个文件,这个目标就是“伪目标”。

2023-11-12 13:41:27 113

原创 动态库&静态库

动态链接的主要目的就是将程序所需要的库函数和外部模块代码保留在独立的库文件中,在程序执行时再加载。函数的实现就在库文件中,库文件就是把原文件经过一定的翻译,然后打包为一个文件提供给用户,这样就无需提供过多源文件,也可以达到隐藏源文件的目的。静态链接的优点是执行速度相对较快,因为所有代码都在一个文件中,不需要额外的加载过程。动态链接的优点是占用空间较小,并且更新方便,只需要替换相应的库文件即可。然而,动态链接的缺点是执行速度相对较慢,因为在执行时需要额外的加载过程。下,以 .so 为后缀的是动态库。

2023-11-10 13:49:21 96

原创 Linux编译器——GCC

预编译生成的 .i 文件不包含任何宏定义,因为所有的宏已经被展开,并且包含的文件也已经被插入到 .i 文件中。处理 #include 预编译指令,将被包含的文件插入到该预编译指令的位置。,每一个汇编语句几乎都对应一条机器指令,所以汇编过程相对于编译比较简单,只需要根据汇编指令和机器指令的对照表一一进行翻译就可以了。预处理主要处理源代码中以 " # " 开始的预编译指令,如:#include,#define等。处理所有 条件预编译 指令,如#if,#ifdef,#elif,#else,#endif。

2023-11-10 13:46:25 93

原创 解决VS中 C4996:‘XXXX ‘: This function or variable may be unsafe问题

解决方式:点击 " 项目属性 ",选择 " C++ " 里的 " 预处理器 " ,在 " 预处理器 " 里面加入一段代码:" _CRT_SECURE_NO_WARNINGS "。

2023-10-12 10:13:44 258

原创 用互斥锁实现读写锁

为了实现多个线程并发的进行读操作,我们需要在读操作之前加锁,并在读操作完成后解锁。读计数器用于跟踪当前正在进行读操作的线程数量。在每个读操作的开头,需要先加锁读计数器,并将读计数器+1,表示当前有一个读操作正在进行。在读操作结束时,需要解锁读计数器,并将读计数器-1,表示当前的读操作已经完成。而对于读操作,多个线程可以并发的获取互斥锁,以允许多个读操作同时进行。需要特别注意的是,在上述实现中,读计数器的加锁和解锁过程需要在加锁和解锁共享数据之前和之后完成,以保证读计数器的正确更新和共享数据的正确访问。

2023-08-01 16:35:15 597

原创 设计模式之观察者模式

观察者模式又被称为(又被称为发布-订阅(Publish / Subscribe)模式),属于行为模式的一种,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。Subject:抽象主题(抽象被观察者),抽象主题角色把所有观察者对象保存在一个集合里,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。ConcreteSubject:具体主题(具体被观察者),该角色将有关状态存入具体观察者对象,在具体主题的内部状态发生改变时,给所有注册过的观察者发送通知。

2023-08-01 16:03:34 49

原创 代码编译的过程

在语义分析阶段,编译器会对抽象语法树进行进一步的分析,验证代码的语义是否正确。抽象语法树是代码结构的一种层次化表示,它反映了代码之间的嵌套和关系,同时出去源代码中的冗余信息,便于后续阶段的处理。在链接阶段,链接器将汇编阶段生成的目标文件以及可能需要的其他库文件链接在一起,生成最终的可执行文件(.exe)。在汇编阶段,汇编器将汇编代码翻译成机器代码,生成以 " .o " 结尾的目标文件。但是还没有生成可执行的机器代码。在编译阶段,预处理后的文件会被编译器翻译成汇编代码,生成以 " .s " 结尾的汇编文件。

2023-07-29 10:40:16 886

原创 C++的内存管理

所以就可能出现这种情况:一个程序因为栈溢出而崩溃的时候,其实它还有大量闲置的堆空间呢,但是我们却无法使用这些闲置的堆空间。所以呢,最好的办法就是让堆和栈一个向上涨,一个向下涨,这样它们就可以最大程度地共用这块剩余的地址空间,达到利用率的最大化。在函数调用时,会将局部变量和调用信息压入栈顶,函数返回时再从栈顶弹出,因此栈区的内存分配是向下增长的。堆从高地址向低地址增长:在堆区动态分配内存时,通常采用首次适应或者最佳适应等方法,为了保证分配的内存块是连续的,需要从低地址向高地址分配。

2023-07-26 11:10:15 41

原创 进程的状态转换

处于阻塞态的进程,在其等待的事件已经发生,如输入/输出完成,资源得到满足或错误处理完毕时,处于等待的进程并不马上转入执行状态,而是先转入就绪状态,然后再由系统进程调度程序在适当的时侯将该进程转为执行状态。正在执行的进程因时间片用完而被暂停执行,或在采用抢先式优先级调度算法的系统中,当有更高优先级的进程要运行而被迫让出处理机时,该进程便由执行状态转变为就绪状态。对就绪状态的进程,当进程调度程序按一种选定的策略从中选择一个就绪进程,为之分配了处理机后,该进程便由就绪状态变为运行状态。

2023-07-25 18:37:27 142

原创 Windows下载安装Boost库及VS属性配置

找到对应版本下载好后双击.exe文件进行安装。选择VC++目录,更改包含目录和库目录。

2023-07-07 18:56:37 935

原创 什么是IO多路复用

在传统IO模型中,为了处理多个客户端连接,通常需要为每个连接创建一个线程或进程来处理其IO操作。IO多路复用通过使用操作系统提供的机制,通常是通过系统调用 ' select () ' 、' poll () ' 、' epoll () ' 等 ,来监视多个IO事件的状态。这些系统调用可以同时监视多个文件描述符,并在其中任何一个文件描述符就绪(可以读取或写入)时通知应用程序,没有文件描述符就绪就会阻塞应用程序,交出CPU。这样,应用程序可以通过单个线程来同时处理多个IO操作,从而提高系统的并发性和性能。

2023-07-07 16:01:16 364 1

原创 设计模之单例模式

单例模式是使用最广泛的设计模式之一。其意图是保证一个类仅有一个对象,即在内存中只会创建一次对象的设计模式,并提供一个访问它的全局访问点,该实例被所有程序模块共享。在程序中多次使用一个对象且作用相同时,为了防止频繁的创建对象消耗内存,单例模式可以让程序仅在内存中创建一个对象,让所有需要调用的地方都共享这一单例对象。

2023-06-30 15:31:18 47

原创 new和delete

new是一个运算符,当需要内存时,可以使用new申请堆区内存,但在用完内存时应当使用delete 去归还内存,以防止内存泄漏。由于new开括的是一块地址,所以需要一个指针来接收这个地址。delete p;构造函数创建完对象后,程序跟踪对象,至到其过期为止。当对象过期时,程序将调用析构函数去完成清理工作。当构造函数中有new申明的变量时,析构函数要用delete去清空相应的对象,反之当构造函数中没有new申明的变量时,析构函数则不需要做任何其他操作。

2023-05-18 15:45:51 55

原创 内存分配和管理

在c语言中有四个函数可以。

2023-05-17 19:35:03 48

原创 inline内联函数

在C++语言中为了解决程序调用函数的效率问题引入了inline修饰符,表示为内联函数。int c = a;a = b;b = c;swap(a, b);关键字inline必须与函数定义体放在一起才能使函数成为内联,仅将inline放在函数声明前面不起任何作用。inline是一种 “用于实现的关键字”,而不是一种“用于声明的关键字”。//错误的!!!

2023-05-05 16:05:50 210

原创 操作系统基础知识(二)

在计算机科学中,删除数据通常只是将数据从文件系统或存储设备的目录中删除,并释放它所占用的空间。因此,即使您删除了数据,也可能可以通过恢复软件或其他技术来找回它们。管道是一种半双工通信机制,同一时刻只能有一个进程向管道中写入数据,另一个进程只能从管道中读取数据。实际上,只有在使用安全删除工具或进行数据覆盖等操作后,才可以确保数据不可恢复地从存储设备中删除。这些操作将数据覆盖或修改为其他数据,使其不再可读或可恢复。管道是一种进程间通信机制,在Linux系统中,管道的底层实现是通过内核中的缓冲区来实现的。

2023-04-13 20:49:52 100

原创 vector容器

总之,vector 迭代器失效的情况比较多,因此在使用 vector 的时候,需要特别小心,避免出现迭代器失效的情况。在 vector 中使用 insert() 函数插入元素时,如果插入的位置在迭代器之前,会导致迭代器失效,因为插入元素会改变 vector 的内存布局,从而导致原有的迭代器指向的元素位置发生变化。vector 对象的大小就是这三个指针(vector 的迭代器就是指针)的总大小,在32位计算机上,一个指针大小为4(64位为8),所以是12个字节,sizeof(vector)= 12。

2023-04-13 20:31:55 71

原创 网络编程一般步骤

典型的服务器程序可以同时服务于多个客户端,当有客户端发起连接时,服务器调用的accept()返回并接受这个连接,如果有大量的客户端发起连接而服务器来不及处理,尚未accept的客户端就处于连接等待状态,listen()声明socket文件描述符处于监听状态,并且最多允许有backlog个客户端处于待连接状态,如果收到更多的连接请求就忽略。三次握手完成后,服务器调用accept()接受连接,如果服务器调用accept()时还没有客户端的连接请求,就阻塞等待直到有客户端连接。

2023-04-04 18:14:01 637

原创 C++基础问题整理(三)

STL的sort算法,数据量大时采用快速排序算法,分段进行归并排序。一旦分段后数据量小于某个门槛(16),为避免快排的递归调用带来过大的额外负荷,就改用插入排序。会根据输入的数据类型、数据量和实现的要求选择合适的排序方法,以尽可能高效地进行排序。虚继承的目的是让某个类做出声明,承诺愿意共享它的基类,这个被共享的基类就称为虚基类,本例中的类。在这种机制下,不论虚基类在继承体系中出现了多少次,在派生类中都只包含一份虚基类的成员。除此之外,还有许多其他的排序算法可供选择,如堆排序、计数排序、基数排序等等。

2023-03-29 15:16:20 34

原创 C++中vector迭代器

该代码定义了一个vector对象v,并使用auto关键字定义了一个迭代器it来遍历vector中的所有元素。C++ STL中的容器类,如vector、list、map、set等都提供了迭代器,可以通过调用容器的成员函数begin()和end()获取指向容器第一个元素和最后一个元素的迭代器。反向迭代器遍历vector的方法与正向迭代器类似,只需使用rbegin()和rend()方法获取反向迭代器的起始和结束位置。迭代器是一个类或者一个指针,它可以指向容器中的一个元素,然后遍历容器中的所有元素。

2023-03-29 14:39:56 4845

原创 C语言知识点整理(二)

函数指针是一个指向函数的指针,指向函数地址。函数指针可以指向任何类型的函数,包括有参函数和无参函数、有返回值的无返回值的函数。//返回类型(*指针变量名)(参数列表);//初始化函数指针,//'&foo'取得'foo'函数的地址,并将其赋值给函数指针变量'ptr'ptr();//调用函数指针指向函数return 0;

2023-03-28 15:13:30 32

原创 C++基础问题整理(二)

虚函数的实现:在有虚函数的类中,类的最开始部分是一个虚函数表的指针,这个指针指向一个虚函数表,表中放了虚函数的地址,实际的虚函数在代码段(.text)中。当子类继承了父类的时候也会继承其虚函数表,当子类重写父类中虚函数时候,会将其继承到的虚函数表中的地址替换为重新写的函数地址。宏没有类型检查,不安全,而内联函数是真正的韩束,只在需要用到的时候内联函数像宏一样展开,所以取消了函数的参数压栈,减少了调用的开销。,C++编译器在编译时会在调用内联函数的地方展开,没有函数压栈的开销,内联函数提升程序的运行效率。

2023-03-23 20:47:10 44

原创 C++基础问题整理(一)

标准库提供的两种智能指针 shared_ptr 和 unique_ptr,二者的区别在于管理底层指针的方法不同,shared_ptr允许多个指针指向同一个对象,内部通过引用计数知道对象被几个指针引用,当引用为0的时候就是该对象将被释放的时候;使用智能指针直接管理动态内存,在使用之后不需要手动释放,当这段内存不再被引用的时候,这段内存会被调用 free 函数来释放,free函数是作为自定义的释放函数传给智能指针的,如果是其他类型的对象,不需要传入释放函数,会默认调用类型的析构函数来释放。

2023-03-21 16:18:05 313

原创 网络基础问题整理(一)

C类:由3字节的网络地址和1字节的主机地址组成,网络中最高位必须是‘110’,地址范围从192.0.0.0到223.255.255.0,可用的C类网络有209万多个,每个网络可以容纳254台主机。该地址分配给任何需要的人使用。A类:由1字节的网络地址和3字节的主机地址组成,网络地址的最高位必须是‘0’,地址范围从1.0.0.0到127.0.0.0,可用的A类网络有126个,每个网络可以容纳1600多万台主机。IP地址和MAC地址属于不同的网络层:IP地址是网络层的地址,用于在因特网上进行数据报的路由选择。

2023-03-15 19:25:11 122

原创 安装乌班图虚拟机:由于找不到VCRUNTIME140.dll,无法继续执行代码。

但是重新安装也没有解决问题,最后,在VS官网下载了VC_redist.x64.exe文件,就可以运行使用虚拟机了。

2023-03-07 15:27:36 456

原创 操作系统问题整理(一)

是指多个进程在运行过程中因为争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用它们都无法再向前推进。互斥锁:每个线程在对资源进行操作之前都要先尝试加锁,加锁成功才能操作,使用过后对资源解锁读写锁:在互斥锁上的基础上增加了读锁和写锁,特点是写独占,读共享。读写锁是“写模式加锁”时,解锁前,所有对该锁加锁的线程都会被阻塞;读写锁是“读模式加锁”时,如果线程以读模式对其加锁会成功,如果线程以写模式加锁会阻塞。读写锁适合于对数据读的次数远大于写。自旋锁:与互斥锁类似,都是保护共享资源。

2023-03-05 15:57:40 183 1

原创 C语言问题整理(一)

C语言问题整理

2023-03-02 16:18:03 59

原创 力扣454~四数相加|| , 哈希表实现

力扣454~ 四数相加II,哈希表实现

2022-12-11 22:43:44 78

原创 力扣209~滑动窗口思想

力扣209~长度最小的子数组,滑动窗口思想

2022-12-04 22:07:15 99

原创 力扣21~合并两个有序链表

力扣21.合并两个有序链表基础做法~

2022-11-27 21:49:22 212 1

编译原理-词法分析程序

对一个简单语言的子集编制一个一遍扫描的词法分析程序

2023-07-10

编译原理-递归下降分析

编制一个递归下降分析程序,实现对词法分析程序提供的单词序列的语法检查和结构分析。

2023-07-10

JAVA飞机大战游戏源码,仅供参考

基于Java的飞机大战游戏主要需要我方飞机和敌方飞机,还有子弹,特殊nPC,开始背景,结束背景,以及背景音乐。我方飞机可以随意移动,敌方飞机无规律出现。游戏玩家通过鼠标移动控制飞机移动,我方飞机在游戏开始时就一直能发射子弹,当我方子弹碰到敌方飞机时,敌方飞机消失。当玩家飞机碰到敌方子弹时,生命值减一,直到玩家飞机生命值为一时,游戏结束。基本模块包括:游戏状态控制功能模块、游戏难度的调整模块、游戏界面绘画功能模块、玩家游戏控制功能模块等。

2023-07-10

VC-redist.x64文件下载

我使用该文件用来解决虚拟机安装:由于找不到VCRUNTIME140.dll,无法继续执行代码错误问题

2023-07-09

Maven下载资源压缩包

Spring Boot 是一个快速构建Spring应用程序的框架,而Maven是一种项目管理工具,用于自动化构建Java项目。可以在Maven的pom.xml文件中添加Spring Boot的依赖来使用它的功能。

2023-07-09

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

TA关注的人

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