自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Rust生命周期边界:类型系统的时间约束艺术

生命周期边界定义了泛型参数中引用的最小存活时间要求。它使用T: 'a语法表示"类型T必须至少活得和生命周期’a一样长"。// 基础示例:生命周期边界的语法// 等价的简化写法(Rust 2018+)self.value// 使用示例println!// holder和data的生命周期关系被编译器验证核心概念T: 'a不是说T的生命周期是’a,而是说T中所有的引用都至少活得和’a一样长。这是一个下界约束。📚优先使用生命周期省略让编译器自动推断只在必要时显式标注理解边界的含义。

2025-10-30 12:03:24 712

原创 Rust借用分割技巧:突破借用检查器的艺术

0.0;rows,cols,// 核心API:分割成行切片self.data.collect()// 高级API:同时获取两行的可变引用unsafe {// 安全性保证:row1和row2不同,所以两个切片不重叠colscols// 实战:高斯消元法(需要同时访问多行)// 使用自定义分割API// 辅助方法:分割出指定行和剩余部分// 测试自定义分割// 同时修改两行。

2025-10-30 11:59:37 394

原创 Rust借用检查器的工作原理:从理论到实践的深度剖析

优先使用所有权转移能move就不要借用使用into_系列方法合理使用引用短期访问用不可变引用需要修改用可变引用避免长时间持有引用善用生命周期省略大多数情况编译器能自动推断只在必要时显式标注内部可变性作为备选RefCell用于单线程场景Mutex/RwLock用于多线程理解运行时开销拆分复杂结构将大结构体拆成小模块使用索引代替引用考虑使用等API核心理念:借用检查器不是敌人,而是你的安全网。它强制你思考数据的所有权和生命周期,写出更清晰、更安全的代码。

2025-10-30 11:50:37 892

原创 Actix-web性能优化技巧:从原理到实践的深度探索

架构层Worker数量 = CPU核心数合理配置backlog和keep-alive使用连接池复用TCP连接数据层避免不必要的clone,善用Arc实现智能缓存策略(DashMap)使用批量操作减少数据库往返并发层阻塞操作必须spawn_blocking实现并发控制和限流使用Semaphore控制资源访问响应层大数据使用流式传输启用HTTP压缩(Gzip/Brotli)设置合理的缓存头监控层集成Prometheus指标使用火焰图分析热点定期进行压测验证。

2025-10-30 11:45:25 831

原创 Rust中的引用计数机制:Rc与Arc深度解析

unsafe {unsafe {优先使用所有权转移:引用计数虽然方便,但会带来运行时开销,能用移动语义解决的问题就不要用引用计数 🎯注意循环引用:使用Weak打破循环,避免内存泄漏 ⚠️性能考量:单线程用Rc,多线程用Arc;避免不必要的克隆操作 ⚡结合其他模式是实现共享可变状态的标准组合 🔧理解底层:深入了解原子操作和内存布局,才能写出高性能代码 📊。

2025-10-30 11:43:16 482

原创 【C++复习4】STL系列

回答:容器可以用于存放各种类型的数据(基本类型的变量,对象等)的数据结构,都是模板类,分为顺序 容器、关联式容器、容器适配器三种类型,三种类型容器特性分别如下:1. 顺序容器容器并非排序的,元素的插入位置同元素的值无关。包含vector、deque、list,具体实现原理 如下:(1)vector 头文件动态数组。元素在内存连续存放。随机存取任何元素都能在常数时间完成。在尾端增删元 素具有较佳的性能。(2)deque 头文件双向队列。元素在内存连续存放。

2025-07-08 10:57:14 928

原创 【C++复习3】类和对象

回答:1. 面向对象是一种编程思想,把一切东西看成是一个个对象,比如人、耳机、鼠标、水杯等,他们各 自都有属性,比如:耳机是白色的,鼠标是黑色的,水杯是圆柱形的等等,把这些对象拥有的属性 变量和操作这些属性变量的函数打包成一个类来表示2. 面向过程和面向对象的区别 面向过程:根据业务逻辑从上到下写代码 面向对象:将数据与函数绑定到一起,进行封装,这样能够更快速的开发程序,减少了重复代码的 重写过程回答:只定义了析构函数,编译器将自动为我们生成拷贝构造函数和默认构造函数。默认构造函数和初始化构造函数。

2025-07-05 17:57:22 1095

原创 【C++复习2】内存篇

怎么检测?第一:良好的编码习惯,使用了内存分配的函数,一旦使用完毕,要记得使用其相应的函数释放掉。第二:将分配的内存的指针以链表的形式自行管理,使用完毕之后从链表中删除,程序结束时可检查改 链表。第三:使用智能指针。第四:一些常见的工具插件,如ccmalloc、Dmalloc、Leaky、Valgrind等等。

2025-07-04 16:08:12 675

原创 【C++复习1】基础篇

回答:1. 概念:函数指针就是指向函数的指针变量。每一个函数都有一个入口地址,该入口地址就是函数指 针所指向的地址。f = &func;3. 函数指针的应用场景:回调(callback)。我们调用别人提供的 API函数(Application Programming Interface,应用程序编程接口),称为Call;如果别人的库里面调用我们的函数,就叫 Callback。1.11.说说静态变量什么时候初始化对于C语言的全局和静态变量,初始化发生在任何代码执行之前,属于编译期初始化。

2025-07-04 15:30:53 1118

原创 【QT】QWidget控件详解 || 常用的API

Qt 提供了多代控件体系:阶段控件库特点第一代QWidgets基于 C++ 的传统 GUI 控件,性能好,适合桌面应用开发第二代声明式语言,用于构建动态 UI,适合移动端和动画效果第三代QML 扩展控件集,跨平台支持更好功能API 方法设置控件可用性设置控件位置move(x, y)设置窗口标题设置窗口图标设置窗口透明度设置光标样式设置字体获取窗口几何信息设置工具提示设置焦点策略设置样式表使用资源路径。

2025-07-03 11:45:20 927

原创 【QT】信号和槽(1) 使用 || 定义

事件与信号在 Qt 中,用户与控件的交互(如点击按钮或关闭窗口)产生事件,每个事件触发相应的信号。信号是事件的通知形式,通过函数表示。响应与槽控件接收信号并作出响应动作,称为槽。槽为普通 C++ 函数,可定义在类的不同访问级别中,并能被关联到一个或多个信号上自动执行信号和槽()是Qt 框架的核心机制之一,用于实现对象之间的通信。它本质上是一种事件驱动的回调机制,但与传统的函数指针回调不同,它是类型安全的、面向对象的,并且可以在运行时动态连接。类型安全信号和槽的参数必须匹配(或兼容)

2025-06-29 16:50:00 670

原创 【QT】第一个QT程序 || 对象树 || 编码时的注意事项

当一个 QObject 子类对象被创建时,可以指定一个父对象(parent),该对象会自动加入到父对象的子对象列表中。实际开发中,是通过代码的方式构造界面为主,还是通过图形化界面的方式构造界面为主?这里我们的按钮没有任何功能,假如我们要实现一定的功能,那该怎么做呢?打开 widget.ui 文件,查看设计的右下角,则有。UI 自动生成的代码(由 .ui 文件转换而来)A 引用 B,B 引用 A,导致无法释放。父对象未正确设置,导致子对象未被自动释放。长生命周期对象持有短生命周期对象的连接。

2025-06-29 16:30:35 820

原创 【QT】QT的发展历史与介绍

Qt(发音为 "cute")是一个跨平台的 C++ 图形用户界面(GUI)应用程序开发框架,由挪威公司 Trolltech(现为 The Qt Company)于 1991 年开发。它不仅支持 GUI 程序的开发,还提供了丰富的类库和工具,能够用于开发非图形界面的应用程序、嵌入式系统、服务器端应用、移动应用等。Qt 是一个开源且商业可用的软件开发框架,采用或商业许可协议发布,开发者可以根据项目需求选择合适的授权方式。跨平台支持(Windows、Linux、macOS、Android、iOS 等)

2025-06-28 10:25:42 1119

原创 【C++11】智能指针的基本用法

C++ 智能指针是 C++11 引入的重要特性,用来,避免内存泄漏和手动delete的麻烦。

2025-05-26 10:26:46 475

原创 【C++11】lambda表达式 || 函数包装器 || bind用法

Lambda 表达式是 C++11 引入的一个非常强大的特性,它允许你在代码中定义,常用于需要传递函数作为参数的地方,比如 STL 算法中的回调。

2025-05-26 10:09:11 1173

原创 【从零实现JsonRpc框架#3】线程模型与性能优化

适用于高并发、低延迟的网络服务场景(如游戏服务器、实时通信)。相结合的方式,通过事件驱动和线程池实现高并发。通过上述方法,Muduo 可以轻松支持。Muduo 默认使用。

2025-05-10 12:34:04 1136

原创 【从零实现JsonRpc框架#2】Muduo库介绍

EventLoop:负责事件循环,监听 I/O 事件和定时器事件。TcpServer:用于创建 TCP 服务器,监听客户端连接。:表示一个 TCP 连接,负责管理客户端与服务器之间的通信。TcpClient:用于创建 TCP 客户端,连接到远程服务器。Buffer:用于处理网络数据缓冲区,支持高效的读写操作。这些类是 Muduo 库的核心组件,通过它们可以轻松构建高性能的 TCP 网络应用。

2025-05-10 12:16:10 1043

原创 【从零实现JsonRpc框架#1】Json库介绍

JsonCpp是一个开源的C++库,用于解析和生成JSON(JavaScript Object Notation)数据。它提供了简单易用的接口,支持JSON的序列化和反序列化操作。JSON是一种轻量级的数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据。在JsonCpp中,所有JSON数据均通过Json::Value类表示。该类支持动态类型判断,并提供了多种方法进行数据操作,如添加、移除、访问数组元素等。JsonCpp的主要功能包括将C++对象序列化为JSON字符串,以及将JSON字符串反序列化

2025-05-10 11:33:51 965

原创 【day04】Fibonacci数列 | 单词搜索 | 杨辉三角

题目链接:解题思路:求斐波那契数列的过程中,判断⼀下:何时n会在两个fib数之间。

2025-05-07 15:02:36 589 1

原创 【day03】简写单词 | dd爱框框 | 除2!

解题思路:简单的模拟。

2025-05-05 13:42:26 185

原创 【Linux网络#5】(UDP的简单应用)DictServer(中译英字典)| ChatServer(简单聊天室)

在之前的代码当中,Echo 服务器收到发的信息,然后再转发对应的信息,但是有个问题,这里不仅要一个人收消息,后面还要我们自己去转发给所有人,此时收消息转消息都是同一个人,UDP 数据一旦过大,服务器可能就没时间接收数据了,而且我们前面也说过 UDP 套接字本身是全双工的,全双工的意思就是 在收数据的同时,也可以发送数据,下面我们举个例子。其目的:将观察者和被观察者代码解耦,使得一个对象或者说事件的变更,让不同观察者可以有不同的处理,非常灵活,扩展性很强,是事件驱动编程的基础。

2025-05-05 02:00:00 1628

原创 【day02】牛牛的快递 | 最小花费爬楼梯 | 数组中两个字符串的最小距离

⽤ prev1 标记 i 位置之前最近⼀次出现的第⼀个字符串的下标;⽤ prev2 标记 i 位置之前最近⼀次出现的第⼆个字符串的下标。模拟:分情况讨论即可。

2025-05-04 12:21:55 334

原创 【Linux网络#4】:Socket编程应用层UDP

错误码定义(Common.hpp)BIND_ERR,// ...其他错误码日志系统(Log.hpp)DEBUG = 0,INFO,WARNING,ERROR,FATAL。

2025-05-04 11:23:05 661

原创 【day01】数字统计 | 两个数的交集 | 点击消除

算法思路:算法思路: 常规操作: 循环提取末尾,然后⼲掉末尾~

2025-05-03 12:43:51 191

原创 【Linux网络#3】网络常见的命令

这是因为部分服务不允许普通用户查看和绑定,想要查看就需要使用。但是如果分开使用两个命令,那么使用方式和之前使用。命令会发现是死循环地执行,如果一般查看是否连通只需要。有的时候可能需要一直查看相关的状态,此时就可以使用。命令终止一个进程,此时需要指定终止的进程的。并将返回结果交给管道,通过管道将结果交给。命令没有区别,所以可以考虑使用管道结合。上面的图中展示了每隔1s执行一次。在终止一个进程时,有时需要使用。,这个命令会将收到的结果作为。返回指定正在运行的程序的。如果是以普通用户使用。

2025-05-03 11:53:25 245

原创 【Linux网络--2】: Socket 编程

但是人是怎么看到聊天信息的呢?怎么执行下载任务呢?怎么浏览网页信息呢?通过启动的 qq,迅雷,浏览器。而启动的 qq,迅雷,浏览器都是进程。换句话说,进程是人在系统中的代表,只要把数据给进程,人就相当于就拿到了数据。但是系统中,同时会存在非常多的进程,当数据到达目标主机之后,怎么转发给目标进程?这就要在网络的背景下,在系统中,标识主机的唯一性。在进行网络通信的时候,是不是我们的两台机器在进行通信呢?日常网络通信的本质:就是进程间通信!!(从应用层上看,不用看网络栈的底层传输)要进程间通信,就要先把进程标识

2025-05-03 11:30:13 1049

原创 【Linux网络#1】:网络基础知识

协议分层是一种将复杂的通信系统划分为多个逻辑层次的方法。每一层专注于特定的功能,并通过接口与上下层交互,从而实现模块化和简化设计。

2025-04-26 12:07:24 928

原创 蓝桥杯Java组国赛G题(01背包问题的变形)

表示只考虑前 $ i $ 个物品,背包容量为 $ j $,并且还没有使用魔法的情况下的最大价值。对于该状态的转移,因为这一状态是未使用魔法的,所以转移方程同01 背包fij0fi−1j0当jwimax⁡fi−1j0fi−1j−wi0vi当j≥wif[i-1][j][0] & \text{当 } j < w[i], \\

2025-03-28 16:31:42 729

原创 【Linux】Linux进程状态与进程优先级(新)

在操作系统中,⼀般会存在⼀个进程状态转换图,例如下图:整个过程中涉及到五个基本进程状态:1.创建(new):表示进程创建2. 运⾏(running):表示进程正在被执⾏3. 等待(waiting):表示进程正在等待具体事件发⽣,也被称为阻塞状态4. 就绪(ready):等待被调度器调度执⾏5. 终⽌(terminated):进程完成执⾏。

2025-03-19 20:25:16 717 1

原创 IPC 进程间通信(一):管道(匿名管道&进程池)

进程可以通过 读/写 的方式打开同一个文件,操作系统会创建两个不同的文件对象 file,但是文件对象 file 中的内核级缓冲区、操作方法集合等并不会额外创建,而是一个文件的文件对象的内核级缓冲区、操作方法集合等通过指针直接指向另一个文件的内核级缓冲区、操作方法集合等。这样以读方式打开的文件和以写方式打开的文件共用一个内核级缓冲区进程通信的前提是不同进程看到同一份共享资源所以根据上述原理,父子进程可以看到同一份共享资源:被打开文件的内核级缓冲区。

2025-03-18 20:49:52 955

原创 Linux中输入和输出基本过程

前面在如何理解Linux一切皆文件的特点中提到为了保证在Linux中所有进程访问文件时的方式趋近相 同,在f ile 结构体中存在一个 files_operations 结构体指针,对应的结构体保存所有文件操作的函 数指针(这个结构体也被称为操作表)每一个f ile 结构体中除了有自己的操作表以外还有一个文件的内核级缓冲区,这个缓冲区不同于语言层 面的缓冲区,在调用底层系统接口的读或者写时,会有一方先将内容保存到该缓冲区,再将内容移动到 指定设备。

2024-12-16 20:58:04 1309

原创 Linux文件操作基础

在Linux第一章提到过, 在Linux中,一切皆文件,而文件由文件内容和文件属性组成,在C语言中可以 使用相应的接口打开文件,例如 fopen 函数。

2024-12-13 15:30:18 1620

原创 【重拾算法第一天】质数&&约数&&欧拉筛 埃氏筛&&GCD

质因数(Prime Factor)是指一个整数的质数因子。换句话说,质因数是能够整除该整数的质数。每个大于1的自然数都可以被唯一分解为质因数的乘积,这称为质因数分解。i > t;return 0;

2024-10-21 17:26:33 759 3

原创 【Linux】Linux进程地址空间

RWX 属性:代表虚拟地址对应的物理地址是否具有读(R)、写(W)和执⾏权限 (X)。前⾯提到,每⼀个进程地址空间区域都由指定的起始值和终⽌值进⾏划分,⽽这些区 域有的是可以写,有的不可以写只能读,但是对于物理内存来说,绝⼤部分的空间都 是可以写的,所以对于限制指定的物理地址是否可以写⼊就是通过 RWX 属性进⾏控制例如,前⾯学习到的栈区和堆区,在程序代码运⾏时,可以在栈区和堆区申请空间并 进⾏写⼊,但是对于字符串常量等具有常性的值就不可以进⾏随意修改和写⼊。

2024-10-19 22:26:23 1653

原创 【Java】Java面向对象与方法

在Java中,方法即为,Java中的方法定义遵循下面的通用格式是否需要返回类型和形参列表需要看该函数的功能,具体思路可以参考C/C++中定义函数的方式。

2024-10-17 18:41:56 822

原创 【Linux】Linux命令行与环境变量

在Linux下输⼊的命令⾸先会被Shell拿到。前⾯提到⽗进程和⼦进程的代码是共有的,但是⼆者数据是各⾃独⽴的,但是数据独 ⽴实际上只会建⽴在其中⼀个进程修改了数据,如果⼆者都是对变量进⾏只读不写, 那么也没有必要单独为两个进程开辟两个数据空间对于上⾯的情况亦是如此,直接在终端上执⾏的进程,其⽗进程都是Shell,并且⽗ 进程和⼦进程都只是以只读的⽅式访问 main 函数的参数,所以就不会出现两个数据 空间。从上⾯的过程中也可以看出,在设计操作系统、编程语⾔等时,相互都是存在依赖关系的。

2024-10-17 17:18:06 1037

原创 【Linux】Linux进程状态与进程优先级

在操作系统中,⼀般会存在⼀个进程状态转换图,例如下图:整个过程中涉及到五个基本进程状态:1.创建(new):表示进程创建2. 运⾏(running):表示进程正在被执⾏3. 等待(waiting):表示进程正在等待具体事件发⽣,也被称为阻塞状态4. 就绪(ready):等待被调度器调度执⾏5. 终⽌(terminated):进程完成执⾏。

2024-10-15 17:49:51 1113

原创 【Java】Java数组类型

在Java中,数组属于引用数据类型,并且也属于一种对象,所以需要使用new创建对象。

2024-10-14 23:07:11 1582

原创 【Java】C++转Java基础知识

在Java中,JDK称为Java开发工具包(Java Development Kit),包含了Java开发需要使用的工具包,前面的版本中JRE和JDK是分开的两个文件夹,从Java9开始,JDK中还包含了JRE(Java Runtime Environment),包含了Java运行的虚拟机JVM和其他,而,原因是Java9引入模块化运行,可能不是每一次的代码运行都需要完整的JRE,根据需要加载可以提高运行效率。在Java中,除了提供了C/C++中存在的算术右移,还提供了无符号右移,使用。

2024-10-13 22:44:18 970

原创 【Linux】Linux进程基础

进程的本质是在计算机内存中运⾏的程序,但是这⼀个概念太过于⼴泛每个应用程序运行于现代操作系统之上时,操作系统会提供一种抽象,好像系统上只有这个程序在运行,所有的硬件资源都被这个程序在使用。这种假象是通过抽象了一个进程的概念来完成的,进程可以说是计算机科学中最重要和最成功的概念之一。

2024-10-13 14:25:50 1201

空空如也

空空如也

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

TA关注的人

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