自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【git】基本操作

git rm 文件名版本撤销只有工作区有该版本,暂存区和版本库都没有,使用命令这种会回退到上一次add时的文件版本工作区,暂存区都有该版本先reset版本库中的当前版本,也就是git reset HEAD,然后再checkout三个区中都是该版本,这里有个前提,commit之后没有执行push到远程仓库,因为我们不能影响远程仓库中的版本。直接使用git reset --hard HEAD^ (HEAD加上 ’^‘ 符号代表当前版本的上一个版本)

2025-03-26 19:14:41 396

原创 【git】认识git的本地仓库

git本地仓库

2025-03-26 18:16:58 559

原创 【线段树】洛谷模板题(懒标记)

线段树是基于分治思想来实现的一颗数,它能维护区间信息(区间和,区间最值,区间gcd(最大公约数)),可以在logn的时间内执行区间修改和区间查询。

2025-03-16 16:17:31 313

原创 【算法】prim算法(最小生成树)

每次遍历寻找最小的d的时间是O(n),我们既然只关心最小的权值,那么我们可以使用一个堆来优化,这里我用大根堆,存储的时候将权值加个负号即可返回最小的权值,也可以使用小根堆,看个人喜好。然后最小的3被弹出,扩展到2,5,这时候堆里面有两个2了,所以就需要判断一下出的节点有没有出圈过,有的话就不走它了。这里有个细节要注意,就是用堆的话,无法删除和修改已进入的点,所以我们拿到当前的最小节点时候要判断是否走过。就比如我1扩展到2,3,4,这时候堆里面会有2,3,4三个节点,

2025-03-04 17:53:16 258

原创 【Redis】redis的单线程模型为什么快?

redis的单线程模型,它处理命令是串行化的,我们就想象好比redis就是一个食堂的窗口,而这个食堂只会有一个窗口, 当学生要吃饭的时候就会来窗口排队,就好比redis的命令到来了, 需要服务器去处理这些命令,那么这些命令就会排队等待处理。所以由于redis的这种单线程模型,注定了它绝对不能允许有那种需要很长时间去处理的命令出现,因为这就导致后面的命令都得不到处理,那么redis就会阻塞住。

2024-12-10 21:34:32 424

原创 【C++】I/O流的使用介绍

在 C++ 中,I/O 流是数据的输入和输出通道。流的本质是一个字节序列,提供了抽象的方式来读写数据。C++ 使用流对象来进行 I/O 操作,主要分为输入流和输出流。输入流:用于从外部设备(如键盘、文件等)读取数据。常用的输入流对象是std::cin。输出流:用于向外部设备写入数据。常用的输出流对象是std::cout。

2024-09-27 13:50:10 334

原创 【Linux】图解详谈HTTPS的安全传输

我们在用http传输数据的时候,通常都是明文传输,这就伴随着我们发送的内容可能会被人截取到,这时候如果有一些不怀好意的人想要获取我们的数据,就很有可能会获取到,造成信息的泄露,所以就有了https的出现。我们也不用太担心,因为我们可以看到证书内容里包含了很多的信息,如果中间人申请了证书,域名肯定是不一样的,况且证书里面还包含了申请者的信息,那么即使追究,也能找到是谁。既然你的对称加密对方会拿到密钥,那我换成非对称加密,在开始的时候,将公钥发给客户端,客户端再用公钥加密发给服务端。

2024-09-27 13:29:17 1795

原创 【Linux】超时重传机制

超时重传机制是一种常见的网络协议设计策略,用于确保数据包在不可靠网络中的可靠传输。它特别适用于UDP等不提供内建可靠性保障的协议。以下是超时重传机制的基本概念和实现方法。在数据传输过程中,发送方在发送数据包后启动一个定时器。如果在预设的超时时间内没有收到接收方的确认(ACK),发送方会重新发送该数据包。

2024-09-24 21:28:18 430

原创 【Linux】快速上手shell脚本(适合初学者)

Shell脚本是一种通过命令行界面执行的一系列命令的文本文件,主要用于自动化任务。

2024-09-24 21:22:20 590

原创 【Linux】HTTPS是如何实现安全传输的

当浏览器请求一个HTTPS网址时,客户端(例如浏览器)会向服务器发起一个HTTPS请求。生成消息摘要(如SHA-256),保证数据的完整性。浏览器会验证这个证书是否由可信的CA签发,并且证书是否有效。对生成的会话密钥进行加密,并将加密后的密钥发送给服务器。中的安全验证,确保通信双方确实是预期的客户端和服务器。将其解密,获得客户端生成的对称密钥(会话密钥)。为了安全地传输会话密钥,客户端会使用服务器的。服务器收到请求后,会向客户端发送包含公钥的。服务器收到加密的会话密钥后,使用自己的。

2024-09-19 23:43:32 589

原创 【Linux】对称加密和非对称加密的区别

对称加密适合快速、大量数据的加密,密钥管理是其弱点。非对称加密提供了更好的密钥管理,但计算复杂,适合用作密钥交换、数字签名等安全要求较高的场景。

2024-09-19 23:41:04 583

原创 【Docker】一文看懂docker run的使用方法

Docker 提供了多种网络模式,例如 bridge、host 和 overlay 等。在容器启动时,可以通过--network选项指定网络模式。bridge(默认模式):容器之间通过 NAT 网络隔离。host:容器和主机共享同一个网络栈,这使得容器中的服务可以直接使用主机的 IP 和端口。此时,容器中的 Nginx 服务会与主机共享网络。还可以通过创建自定义的网络,容器可以通过该网络进行互联。

2024-09-17 12:48:17 3684

原创 【C++】一文带你彻底了解构造函数

构造函数是一种特殊的成员函数,它在对象创建时自动调用,用于初始化对象的成员变量。其名称必须与类名相同,且没有返回类型(即使是void也不能)。public:// 构造函数的主体,用于初始化操作当对象被创建时,构造函数MyClass()会自动执行。一旦用户定义了带参数的构造函数,编译器将不会提供默认构造函数。public:// 显式声明默认构造函数C++ 构造函数是对象初始化的核心机制,通过不同类型的构造函数(默认、带参数、拷贝、移动)实现对象的多样化创建方式。

2024-09-17 12:41:46 9798

原创 【Linux网络】Socket套接字

Socket是一个双向的通信端点。它允许一台计算机的程序与另一台计算机的程序进行数据传输。TCP (传输控制协议):提供可靠的、面向连接的通信服务。TCP连接像一个虚拟的电路,两端通过Socket进行数据传输,确保数据包按顺序到达。UDP (用户数据报协议):提供无连接、尽力而为的通信服务。与TCP不同,UDP没有建立连接过程,数据包可能会丢失或乱序,但它更快,适合对时延敏感的应用场景。

2024-09-12 23:18:54 829

原创 【C++】用C++在Linux环境下实现简单的Web服务器

Web服务器的核心任务是处理客户端发来的HTTP请求并返回HTTP响应。实现这一功能的第一步是理解网络套接字。套接字是一种允许程序与网络通信的机制。以下是用C++编写一个简单Web服务器的基本框架。你可以通过浏览器访问。服务器启动后,将监听。

2024-09-12 23:16:20 1022

原创 【C++】C++ 多态的底层实现原理

多态指的是同一操作在不同对象上具有不同的表现。编译时多态(静态多态):如函数重载、运算符重载,通过编译器在编译时决定调用哪个函数。运行时多态(动态多态):主要通过继承和虚函数实现,调用函数时根据实际对象的类型动态决定调用哪个函数。本文重点讨论运行时多态,它是通过虚函数机制实现的。

2024-09-11 22:26:02 1391

原创 【C++】new的底层实现原理

new的底层原理

2024-09-11 22:20:55 1866

原创 【Linux】可重入与线程安全的联系与区别

虽然可重入函数通常是线程安全的,但线程安全的函数未必是可重入的。例如,某个函数使用了锁来确保线程安全,但它在执行时持有锁,这就意味着它不能在信号处理程序或中断中被安全调用,因此它不是可重入的。的函数是指能够在被中断后,再次从头开始执行而不会影响其正确性的函数。换句话说,如果在一个可重入函数的执行过程中,出现了新的调用(无论是来自同一线程还是另一个线程),函数的执行仍然是正确的。是两个重要概念,它们都与程序在多线程环境下的正确性有关。指的是代码能够在多个线程并发访问的情况下仍能保持正确的行为。

2024-09-10 21:06:22 1157

原创 【Linux】线程安全问题

在多线程编程中,线程安全(Thread Safety)是指程序在多个线程同时执行时,能够正确地共享和访问资源而不出现数据不一致或竞争条件的情况。线程安全的代码确保多个线程在没有同步机制的情况下不会破坏数据或引发意外行为。

2024-09-10 20:56:46 831

原创 【Linux】 Linux 死锁

死锁指的是多个进程或线程因为互相等待对方持有的资源,导致这些进程或线程都无法继续执行的情况。死锁的典型场景是线程 A 锁住了资源 X,并等待资源 Y,而线程 B 锁住了资源 Y,并等待资源 X。由于双方都在等待对方释放资源,最终进入僵局。

2024-09-08 22:17:49 1495

原创 【Linux】Linux 可重入函数

简单来说,可重入函数是线程安全的函数。当函数正在执行时,如果它被其他线程或中断再次调用,它能够正确处理这种情况。不使用静态或全局变量,或仅使用局部变量。不依赖非线程安全的库函数,如malloc或strtok。不修改输入参数。如果函数需要访问共享资源,则必须使用同步机制(如锁或信号量)来避免竞态条件。

2024-09-08 22:15:30 1148

原创 【Linux】Linux 共享内存:高效的进程间通信

共享内存是一块可以被多个进程同时访问的内存区域,允许不同进程读取和写入同一份数据。每个进程都可以直接访问这块内存,不需要通过管道、套接字或消息队列进行数据传输。这种直接访问的特点使得共享内存成为最为高效的进程间通信机制之一,适用于需要频繁交换大量数据的场景。

2024-09-07 21:01:33 1470

原创 【Linux】Linux 管道:进程间通信的利器

管道是一个双端的通信通道,其中一端用于写数据,另一端用于读数据。它是 Linux 系统中最简单且常用的进程间通信方式之一,尤其适合父子进程之间的数据传递。数据从管道的一端写入,另一端读取,保证了进程之间的同步与协作。

2024-09-07 20:59:03 732

原创 【C++】main函数是怎么开始的呢?

当一个 C++ 程序启动时,操作系统负责加载可执行文件并将控制权移交给程序。操作系统加载可执行文件:操作系统将可执行文件加载到内存,并设置程序的堆栈指针等。调用启动例程(Startup Code):在调用main函数之前,程序会首先执行启动代码,这个启动代码由编译器或标准库提供,通常称为_start函数。它负责为程序的执行做准备。初始化全局/静态变量:C++ 中,全局变量和静态变量的初始化在main函数之前进行。编译器生成的启动代码会负责这些变量的初始化。对于构造函数,需要先调用构造函数初始化对象。

2024-09-05 16:38:22 1162 1

原创 【C++】使用switch时应注意的一些细节

之间的 fall-through,但不推荐在不需要的地方省略。时,代码会变得难以维护。,这能提高程序的健壮性,避免出现无法预测的情况。如果不使用大括号,可能会出现变量冲突问题。标签后定义变量时,必须显式用大括号。:C++17 之后,允许显式使用。包裹其作用域,以避免变量名冲突。标签过多或需要处理复杂的逻辑时。分支,以处理所有未明确列出的。这种写法简洁有效,避免重复代码。:如果需要检查范围,可以用。标签后,通常需要一个。也可以增加代码可读性。),也不支持字符串类型。,不能是范围或变量。

2024-09-05 16:33:16 808

原创 【C++】static作用总结

局部静态变量:跨函数调用保持值,生命周期为整个程序运行期。类静态成员:类级别的共享成员,可以不通过实例访问。文件静态变量/函数:限制变量和函数的作用域到定义它的文件中,避免外部访问。

2024-09-05 16:29:59 518

原创 【Linux】深入理解Linux文件系统中的inode

inode(Index Node)是Linux文件系统中的一种数据结构,用于存储文件的元数据(metadata),例如文件的大小、权限、所有者、创建时间等。每个文件和目录都对应一个唯一的inode,文件系统通过inode来管理和访问文件的相关信息。需要注意的是,inode不存储文件的实际数据内容,它只包含指向数据块的指针,而数据块中才存储了文件的实际内容。inode在Linux文件系统中扮演着关键角色,负责管理和访问文件的元数据。理解inode。

2024-09-04 22:57:23 2401

原创 【Linux】理解Linux中的软链接与硬链接

硬链接是指多个文件名指向同一个数据块。每个硬链接都拥有相同的inode号,即它们实际指向的是相同的物理存储位置。相同的文件数据:硬链接文件与原始文件共享相同的数据块,因此它们的内容完全一致。共享inode号:硬链接与原始文件共享相同的inode号,这意味着它们是同一个文件的不同引用。删除影响:只有当所有硬链接和原始文件都被删除时,数据块才会被释放。如果删除一个硬链接或原始文件,其他硬链接仍然能够访问文件数据。同一文件系统:硬链接只能在同一个文件系统内创建,因为它们直接指向文件的inode。

2024-09-04 22:53:09 805

原创 【C++】C++智能指针详解

程序员可以有效地管理内存的分配与释放,减少内存泄漏的风险,并在需要时打破循环引用。掌握智能指针的使用是现代C++编程的基础,这不仅能提升代码的健壮性,还能使代码更加易于维护。C++中的智能指针是现代C++编程中管理动态内存的关键工具。这样,开发者无需手动管理内存的释放,大大降低了出现内存泄漏的风险。被销毁时,才会释放对象的内存。是一种共享所有权的智能指针,可以让多个指针同时指向同一个对象。如何共享对象的所有权,并通过引用计数来管理对象的生命周期。不会影响对象的引用计数,因此它不会阻止对象的销毁。

2024-09-03 21:38:49 725

原创 【C++】C++ I/O流详解

C++的I/O流(输入/输出流)为处理输入和输出操作提供了一种强大且灵活的方式。它们是C++标准库的一部分,能够让程序从不同的来源读取数据并向各种目的地写入数据,比如控制台、文件,甚至是内存缓冲区。在C++中掌握I/O流的使用,对于高效地处理数据输入输出至关重要。默认情况下,C++的输出流是带有缓冲区的。C++的I/O流基于“流”的概念,流可以理解为数据从输入设备(如键盘、文件等)到程序或从程序到输出设备(如屏幕、文件等)传输的途径。文件流是C++中另一个常用的I/O操作类型。,并最终显示在屏幕上。

2024-09-03 20:59:18 690

原创 【C++】C++中的特殊类:懒汉模式与饿汉模式

单例模式(Singleton Pattern)是一种设计模式,旨在确保一个类只有一个实例,并提供一个全局访问点。通常用于管理全局状态、资源或配置信息。单例模式的关键在于控制实例化的时机和方式,而懒汉模式和饿汉模式则分别代表了不同的实例化策略。懒汉模式和饿汉模式是单例模式的两种常见实现方式,各有优缺点。在C++中,选择哪种模式应根据实际需求和使用场景来决定。懒汉模式通过延迟加载节省资源,但需要处理线程安全问题;饿汉模式实现简单且线程安全,但可能会导致不必要的资源占用。

2024-09-02 21:18:03 1158

原创 【C++】C++ 多态的底层实现

C++通过虚函数和虚表实现了强大的多态性机制,允许程序在运行时动态地决定调用哪个函数。这种机制虽然引入了一定的内存和性能开销,但在面向对象编程中提供了极大的灵活性。理解其底层实现对于编写高效、健壮的C++代码具有重要意义。

2024-09-02 21:15:42 1578

原创 【C++】探索C++中的异常处理:`try-catch`的使用与最佳实践

在程序执行过程中,可能会遇到各种异常情况,比如除零错误、内存分配失败或文件无法打开等。这些异常情况如果不加以处理,可能会导致程序崩溃或行为异常。C++通过异常处理机制,允许程序在异常发生时捕获并处理这些错误,从而避免程序崩溃。不要在catch块中捕获所有异常,除非你有充分的理由。捕获特定的异常类型能够帮助你更好地理解和处理错误。

2024-09-01 16:45:20 2142

原创 【C++】深入理解C++模板:从基础到进阶

模板是C++中用于泛型编程的工具。它允许你编写可以处理任意类型的函数和类,而不必重复编写相似的代码。函数模板和类模板。

2024-09-01 16:42:17 775

原创 【Linux】理解动态库与静态库:编程中的两种关键库

静态库(Static Library)是指在编译时被嵌入到可执行文件中的库。它通常以.a(在 Unix/Linux 系统中)或.lib(在 Windows 系统中)为扩展名。在程序编译期间,静态库的代码被复制到每一个使用它的可执行文件中,因此,最终生成的可执行文件是一个独立的、完整的二进制文件。动态库(Dynamic Library),也称为共享库(Shared Library),是在程序运行时加载的库。它通常以.so(在 Unix/Linux 系统中)或.dll(在 Windows 系统中)为扩展名。

2024-08-30 23:39:37 1958 4

原创 【Linux】 理解 Linux 中的 `dup2` 函数

dup2dup2是一个强大且灵活的系统调用,可以在文件描述符管理中发挥重要作用。无论是重定向标准输入/输出,还是在进程间通信中创建管道,dup2都是一个不可或缺的工具。通过熟练掌握dup2,你可以更有效地控制程序的 I/O 操作,从而编写出更加健壮和高效的应用程序。

2024-08-30 23:35:53 1722

原创 【Linux】深入探讨Linux进程等待:`waitpid`与`wait`

wait是一个用于等待任一子进程终止的系统调用。父进程调用wait后会被挂起,直到它的某个子进程终止,操作系统会将子进程的退出状态返回给父进程。如果没有子进程,wait会立即返回。status:用于存储子进程的终止状态。如果不关心子进程的退出状态,可以将其设置为NULL。正常返回时,wait返回终止的子进程的PID;如果出错,返回-1,并设置errno来指示错误原因。

2024-08-29 11:02:39 1402

原创 【Linux】进程等待详解:概念、类型与优化策略

进程等待是指进程在执行过程中因某些条件未满足而暂时停止执行的状态。这些条件可以是等待输入/输出操作完成、资源可用、某个事件发生等。进程等待在多任务操作系统中尤为重要,因为它有助于提高系统资源的利用率。

2024-08-29 10:59:08 811

原创 【C++】new和定位new

new和定位new

2024-08-28 17:29:22 619

原创 【C++】一文看懂 C++ 多态:动态与静态多态的全面剖析

多态来源于希腊语,意为“多种形态”。在编程中,多态性指的是在相同的接口下,不同的数据类型可以表现出不同的行为。编译时多态和运行时多态。编译时多态通过函数重载和运算符重载实现,允许在编译阶段确定具体的函数调用。运行时多态通过虚函数和继承实现,允许在运行时根据对象的实际类型确定具体的函数调用。多态性极大地提高了代码的灵活性和可维护性,是面向对象编程中不可或缺的组成部分。

2024-08-27 13:54:47 1645 1

空空如也

空空如也

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

TA关注的人

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