自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 我的年度写作计划

这是笔者的2025开发计划!

2025-02-08 22:21:10 655

原创 架构八股文:ARM架构三大基本状态和寄存器说明

摘要: ARM架构包含三种基本状态:ARM状态(32位指令高性能)、Thumb状态(16位指令节省空间)和Jazelle状态(已废弃的Java加速状态)。状态间可通过BX指令切换,LSB位决定目标状态。ARMv7-A架构有37个寄存器,包括16个通用寄存器(R0-R15)、CPSR/SPSR状态寄存器及模式私有寄存器。CPSR记录处理器状态,通过T位区分ARM/Thumb状态。不同处理器模式(如FIQ、IRQ)拥有独立的banked寄存器组,可减少上下文切换开销。R13-R15分别用作栈指针、链接寄存器和程

2025-08-05 10:43:27 648

原创 操作系统:内存申请接口详解

摘要: 本文详细解析了Linux内核中的内存申请接口,包括kmalloc、kzalloc和vmalloc的工作原理及适用场景。内存子系统被划分为ZONE_DMA、ZONE_NORMAL和ZONE_HIGHMEM区域,配合Buddy分配器(大页管理)和SLAB/SLUB/SLOB分配器(小对象优化)实现高效管理。kmalloc/kzalloc分配物理连续内存,前者可能包含垃圾数据,后者自动清零;vmalloc则分配虚拟连续但物理不连续的内存,适合大块分配但性能较低。文章对比了三者的特性差异,并解释了GFP标志

2025-08-04 12:00:21 346

原创 操作系统:内核态和用户态

本文讨论了操作系统中的内核态和用户态概念及其区别。用户态运行普通应用程序,权限受限,需通过系统调用访问硬件;内核态运行操作系统核心代码,拥有完全权限。文章分析了引入双态的必要性:安全性、稳定性、硬件抽象和权限分级。重点阐述了四种状态切换场景:系统调用、硬件中断、异常处理和进程调度,并解释了切换带来的性能开销,包括上下文保存/恢复、缓存失效和数据拷贝等。本文对理解操作系统的核心机制具有重要参考价值。

2025-08-04 10:29:48 857

原创 梭哈图算法——图(Graph)知识点概览

​ 我们在熟悉数组,链表,树,哈希表等基本的数据结构之后,就可以准备聊聊图了。​ 图是这样的一个数据结构,它由若干个点和描述这些点之间如何连接的线组成。图(Graph)是一种由**顶点(Vertex)边(Edge)**组成的数据结构,用于表示实体之间的各种关系。在计算机科学与日常生活中,图被广泛用于:社交网络、网络路由、推荐系统、任务调度等场景。​ 这也就是说,他的使用是非常广泛的,上到评估交通状况,下到我们的网络路由和好友推介,基本上都是依赖图这个数据结构进行工作的。

2025-08-03 12:21:33 821

原创 构建热插拔式 Qt 插件系统 —— 基于 QPluginLoader 的控件平台封装实践——详解Desktop中如何抽象PluginServer的

本文介绍了如何基于Qt的QPluginLoader构建热插拔插件系统。首先阐述了QPluginLoader的核心功能:跨平台加载动态库、实例化插件对象、提供统一接口和管理生命周期。通过定义抽象接口类DesktopPluginWidgetBase,并使用Q_DECLARE_INTERFACE宏注册接口,实现了插件框架的基础。以桌面卡片组件为例,展示了具体实现:WeatherCard_Plugins继承接口并重写factorize_widget方法返回实际控件。这种设计模式实现了功能模块的动态加载,为嵌入式设备

2025-08-01 12:54:23 1187

原创 使用责任链来完成鼠标事件的责任处理——MouseManager与MouseProcessor

本文介绍了基于Qt6设计的鼠标事件责任链处理框架MouseManager和MouseProcessor。该方案采用责任链模式,将鼠标事件处理逻辑分解为独立的处理器节点,通过动态注册实现解耦和扩展。核心思想是:MouseManager收集鼠标事件信息后,依次传递给注册的MouseProcessor链,每个处理器判断是否处理该事件,未处理则继续传递。这种设计解决了传统事件处理代码臃肿、耦合度高的问题,支持运行时灵活配置处理器顺序和优先级,提高了代码的可维护性和可扩展性。文中展示了简洁的事件处理接口和典型的处理流

2025-08-01 10:50:05 1142

原创 Linux与系统基础八股文

Linux内核是一个复杂的软件系统,其核心模块包括进程管理、内存管理、文件系统、设备驱动、网络协议栈和系统调用接口。用户空间与内核通信主要通过系统调用、进程间通信机制、proc和sysfs文件系统、ioctl以及Netlink套接字等方式实现。以read()系统调用为例,内核会进行用户态到内核态的切换、参数检查、文件描述符映射、权限验证、文件系统操作、缓存处理、设备驱动交互等步骤。系统调用的核心作用是提供用户程序访问硬件的安全途径,实现用户态与内核态的隔离,为应用程序提供操作系统核心服务,确保系统安全和稳定

2025-07-31 08:48:27 820

原创 计算机网络八股文——TCP,UDP

TCP与UDP是传输层两大核心协议,主要区别体现在: 连接性:TCP面向连接需三次握手,UDP无连接直接发送 可靠性:TCP通过序列号、确认应答等机制保证可靠传输,UDP不保证可靠性 顺序性:TCP保证数据有序,UDP不保证 控制机制:TCP有流量/拥塞控制,UDP没有 效率:TCP报头大传输慢,UDP报头小传输快 TCP适用于文件传输、网页浏览等可靠性要求高的场景;UDP适合视频直播、在线游戏等实时性要求高的应用。HTTP1.1相比1.0主要改进包括:默认持久连接、支持管道化、增强缓存控制、引入范围请求等

2025-07-31 08:47:28 976

原创 C++八股文——OOP与现代C++特性若干

本文介绍了C++中面向对象编程的两个关键概念:继承、虚继承和多态类的内存布局。 继承允许派生类复用基类的成员,建立类层次结构。普通继承分为public、protected和private三种方式,影响成员访问权限。子类构造时先调用基类构造函数,析构时顺序相反。 虚继承通过virtual关键字解决多重继承中的菱形问题,确保公共基类在最终派生类中只有一个实例,但会增加内存开销。虚基类由最终派生类直接构造一次。 多态类通过虚函数表(vtable)实现动态绑定。包含虚函数的类会在对象中添加虚表指针(vptr),指向

2025-07-31 08:46:28 966

原创 操作系统——内存管理八股文

malloc()函数的底层实现主要依赖于内存池管理和系统调用。它通过brk/sbrk或mmap系统调用从操作系统获取大块内存,然后使用首次适应、最佳适应等算法管理这些内存块。现代实现通常结合mmap处理大内存分配,以减少碎片并提高效率。mmap允许将文件或匿名内存映射到进程地址空间,支持高效IPC和大文件处理,而munmap则用于释放映射区域。内存管理还需考虑线程安全和碎片问题,不同C库(如glibc、jemalloc)有各自的优化策略。

2025-07-30 11:26:59 908

原创 C++八股文——基础

本文总结了C/C++语言的主要区别以及相关核心概念: C/C++区别:从编程范式、对象概念、内存管理、类型安全等10个方面对比了两者的差异,重点指出C++支持面向对象、模板、异常处理等特性。 new与malloc:详细对比了两种内存分配方式的7个主要区别,包括类型、构造析构、异常处理等,强调new是类型安全的面向对象内存管理方式。 指针与引用:从概念、可变性、安全性等8个维度比较了两者的本质区别,指出指针是独立的地址变量而引用是变量的别名。 extern "C":解释了该指令的作用是解决

2025-07-30 11:26:10 807

原创 C++八股文——OOP与现代C++特性若干

摘要:本文介绍了面向对象编程中的继承和虚继承机制。继承允许子类复用父类代码,建立类层次结构,访问权限和构造/析构顺序是关键点。虚继承通过virtual关键字解决多重继承的菱形问题,确保公共基类只有一个实例,但会增加内存开销。多态类通过虚函数表(vtable)和虚指针(vptr)实现动态绑定,vtable存储虚函数地址,vptr在对象构造时指向正确的vtable。单继承情况下,对象内存布局包含vptr、基类和派生类成员变量。虚继承和多重继承会引入更复杂的内存布局和额外的vptr。

2025-07-30 11:25:24 891

原创 操作系统——进程同步八股文

本文深入解析了并发编程中的核心概念及其关系。首先阐明并发在单核和多核CPU中的不同表现,接着对比同步(顺序执行、依赖等待)与异步(独立执行、无需等待)的特性。重点分析了互斥(独占访问共享资源)、阻塞(暂停执行)和非阻塞(立即返回)的概念及其应用场景。进一步探讨线程同步与互斥的关系,指出互斥是同步的特殊形式。最后,系统介绍了进程管理中的三种特殊进程:孤儿进程(被init收养)、僵尸进程(未回收的终止进程)和守护进程(后台服务)。文章通过丰富的类比(如咖啡店场景)使复杂概念通俗易懂,并特别强调同步不一定阻塞(如

2025-07-30 10:26:59 666

原创 操作系统八股文收集 —— 进程和线程八股文

整理了常见的操作系统——线程部分的八股文

2025-07-30 10:15:49 1077

原创 设计自己的小传输协议 状态机解析与封装抽象

本文介绍了一个自定义数据传输协议的状态机实现方案。通过C++类DataProtocolizedController封装了协议的核心逻辑,使用状态机模式处理数据包的解析与封装。该协议支持文件传输功能,包含起始帧、数据帧和结束帧三种类型,实现了分块传输、进度反馈和错误处理机制。协议头部定义了文件ID、偏移量、总大小等元信息,并支持文件名传输。代码展示了如何通过状态转换(ReadingHeader/ReadingName/ReadingData)逐步解析接收到的数据,同时提供了发送各类数据帧的接口方法。该设计具有

2025-07-26 14:21:03 239

原创 设计自己的小传输协议 导论与概念

本文介绍了自定义网络传输协议的设计要点,重点讨论了协议头结构和CRC校验机制。在协议头设计方面,作者提出了7个关键原则,包括简洁高效、必要元数据、长度管理、字节序统一、完整性校验、可扩展性和安全防护。作者展示了一个紧凑的协议头结构设计示例,采用32位magic number、版本号、状态标识等字段,并详细说明了状态机设计。在CRC校验部分,文章讲解了CRC的基本原理和工作流程,包括模2除法的特点、计算示例以及CRC-32的高效查表法实现,为数据传输提供可靠的错误检测机制。

2025-07-26 14:07:14 619

原创 快速入门Socket编程——封装一套便捷的Socket编程——封装接口

本文介绍了一个基于Reactor模式的Socket编程封装框架,采用C++实现跨平台网络通信。核心设计包括: 异步回调机制 - 通过ServerWorkers和ClientWorker结构体封装各种回调函数(连接建立、数据接收、关闭处理等),实现业务逻辑与网络层的解耦 pImpl惯用法 - 使用接口类(ServerSocketInterface/ClientInterface)隐藏平台相关实现(ServerSocket/ClientSocket),通过unique_ptr自动管理资源 Reactor模式 -

2025-07-25 10:50:47 454

原创 快速入门Socket编程——封装一套便捷的Socket编程:基于Epoll的框架思路说明

Socket编程与Epoll框架摘要 本文详细介绍了Linux下基于epoll的高性能Socket编程框架。epoll作为I/O多路复用机制,相比select/poll具有O(1)事件查询优势,适用于高并发场景。文章从epoll原理、API使用、触发模式(LT/ET)到非阻塞设置等核心概念进行剖析,并提供了事件循环的典型写法及常见工程实践要点。 在实现层面,框架分为配置、监听、epoll初始化和事件循环四个阶段:1)配置阶段完成协议参数映射;2)监听阶段创建socket并绑定端口;3)epoll初始化设置非

2025-07-25 10:43:37 1127

原创 快速入门Socket编程——封装一套便捷的Socket编程——Reactor

本文介绍了Socket编程中的Reactor和Proactor两种设计模式。Reactor是一种基于事件驱动的同步I/O模型,通过epoll等机制监听多个I/O句柄,在事件就绪时分发给对应处理器。文章详细说明了Reactor的工作流程、核心组件及特点,并提供了示例代码片段。作为对比,Proactor是异步I/O模型,内核完成I/O操作后通知应用程序。最后分析了两种模式的差异,并解释了项目中选用Reactor的原因,主要由于Linux平台epoll的成熟性和高效性。文章为理解高性能网络编程提供了清晰的技术框架

2025-07-25 10:33:52 694

原创 快速入门Socket编程——封装一套便捷的Socket编程——导论

本文介绍了Socket编程的核心流程与关键API,包括socket创建、bind端口绑定和listen监听设置。重点讲解了socket()函数中domain、type和protocol参数的含义,bind()函数中sockaddr结构体的使用及字节序转换问题,以及listen()函数中backlog参数对连接队列的影响。文章还提供了避免端口绑定冲突的SO_REUSEADDR技巧,为后续封装Socket编程接口奠定了基础。

2025-07-25 09:38:00 1075

原创 QML速学笔记1

QML速学笔记摘要 本文介绍了QML基础组件的使用方法,重点讲解了Window、Rectangle和Item三种核心组件。 Window组件是QML应用的顶级窗口容器,主要属性包括: 窗口可见性(visible)、大小(width/height) 标题(title)、最小/最大尺寸限制 窗口标志(flags)、背景色(color) 位置(x/y)、模态类型(modality) Rectangle组件用于创建可视化元素,支持: 大小(width/height)、颜色(color) 圆角(radius)、边框(

2025-07-24 13:12:40 364

原创 算法八股文:说一说快速排序和堆排序(C++)

快速排序采用分治思想,通过选取基准值将数组分为两部分递归排序,优化措施包括随机化基准值、三数取中法和混合插入排序。堆排序基于完全二叉树特性,先构建大顶堆,然后不断交换堆顶元素与末尾元素并调整堆结构。两种算法各有优劣:快速排序平均时间复杂度O(nlogn)但可能退化,堆排序稳定保持O(nlogn)但实现较复杂且不稳定。实际应用中常采用优化版的快速排序(如三数取中+小数组改用插入排序)。

2025-07-23 12:37:21 656

原创 网络编程系列:C++使用Linux的API快速获取网卡信息(AddressInfo)

本文介绍了在Linux系统下使用C++获取网卡信息的方法,重点解析了getifaddrs()和freeifaddrs()这两个API的使用。文章详细讲解了struct ifaddrs结构体的各个成员,包括链表指针ifa_next、接口名称ifa_name、标志位ifa_flags、IP地址ifa_addr、子网掩码ifa_netmask以及广播/点对点地址等。最后提供了一个示例代码,展示如何遍历网卡信息链表并获取IP地址等网络接口信息。该技术可用于开发网络库或网络监控工具,是网络编程的基础知识。

2025-07-23 08:45:54 521

原创 C/C++网络编程之快速整理Socket编程模板

本文整理了C/C++中Socket网络编程的核心知识点,包含以下内容:1) 关键函数如socket()、bind()、listen()等;2) TCP/UDP通信流程;3) I/O模型(阻塞/非阻塞/select/epoll)和并发方式;4) 粘包问题解决方案;5) Qt网络编程示例;6) TCP/UDP服务端代码示例;7) 多线程/多进程服务器实现;8) select/epoll高并发模型。文章提供了清晰的代码模板和流程图解,适合开发者快速掌握网络编程核心概念和实现方法。

2025-07-18 10:07:31 384

原创 嵌入式Linux八股文1:仔细说说UBoot的启动流程

本文详细分析了U-Boot在嵌入式Linux系统中的两种启动流程:无设备树(ATAG)和有设备树(DTB)方式。核心流程包括:CPU上电初始化、SPL阶段准备、重定位前硬件初始化(board_init_f)、代码重定位与修正、完全初始化(board_init_r)。关键区别在于有设备树方式需要加载并调整DTB文件,通过fdt命令修改硬件信息,最终将DTB地址传递给内核。文章还对比了两种方式下内核参数传递机制,并梳理了Linux内核启动后的设备树解析流程。整个过程体现了从底层硬件初始化到高级功能准备的完整启动

2025-07-18 09:42:44 877

原创 使用Proxy设计模式来增强类的功能:ToastProxy和DesktopToast的设计关系

​ 这个算设计模式的部分,笔者当时正在设计的是如何让我的Desktop支持扩展的从Protocol Json Buffer转换到我的Toast可以识别的Meta Info的问题。这也是笔者写下这篇设计文档的原因——设计文档鸽了一个月(之前一直认为这个项目还没有成型的框架,因此迟迟没有动笔)

2025-07-17 18:44:29 1454

原创 Leetcode Easy刷题:合并两个连续系列

​ 我们下面准备聊的是合并两个连续数组:给你两个按排列的整数数组nums1和nums2,另有两个整数m和n,分别表示nums1和nums2中的元素数目。请你nums2到nums1中,使合并后的数组同样按排列。**注意:**最终,合并后数组不应由函数返回,而是存储在数组nums1中。为了应对这种情况,nums1的初始长度为m + n,其中前m个元素表示应合并的元素,后n个元素为0,应忽略。nums2的长度为n。​ 很显然,我们的第一个反应就是,

2025-07-16 12:23:19 337

原创 Leetcode Easy题小解(C++语言描述)1

摘要 本文介绍了几个LeetCode简单题的C++解法: 相交链表 - 两种解法:使用unordered_set存储节点查询重复(O(n)空间),或快慢指针同步遍历(O(1)空间)。 链表反转 - 通过三指针法(当前、前驱、后继)逐步反转节点指向。 回文链表 - 利用栈的FILO特性,先压栈再比对,时间复杂度O(n)。 前K高频元素 - 先用哈希表统计频率,再用大根堆获取前K个。 快速选择算法 - 使用快速排序的partition思想在O(n)时间复杂度内找到第K小元素,避免完全排序。 这些题目涵盖了链表操

2025-07-15 10:18:14 952

原创 我的Qt八股文笔记2:Qt并发编程方案对比与QPointer,智能指针方案

这篇文章主要是对比Qt所有的并发编程方案和QPointer的讲解

2025-07-14 09:25:57 1009

原创 我的Qt八股文面试笔记1:信号与槽&&文件流操作

深入了解我们的Qt信号与槽 + 文件流操作,八股文全面整理

2025-07-14 09:24:33 691

原创 我的LeetCode刷题笔记——树(2)

Leetcode二叉树的笔记的第二部分

2025-07-12 10:58:39 528

原创 C++面试冲刺笔记2:聊一聊常见的容器 + API + 一些相关的八股文

C++标准库中常用的容器类型及其核心API,帮助开发者快速查阅和复习

2025-07-12 09:36:55 666

原创 我的LeetCode刷题笔记——树(1)

二叉树基础概念回顾:节点结构、遍历方式分类(前序/中序/后序/层序) 层序遍历核心框架:使用队列实现BFS,时间复杂度O(n) Z字形遍历实现技巧:通过方向标志位和reverse操作实现锯齿形输出 典型题目解析:提供层序遍历(题目1)和分层输出(题目2)的代码实现 复杂度分析与扩展思路:讨论时间/空间复杂度,并建议后续刷题顺序(从基础层序到Z字形遍历)

2025-07-10 11:53:40 274

原创 C++面试冲刺笔记1:虚函数的基本工作原理

本文深入探讨C++虚函数的工作原理及实现细节。虚函数通过virtual关键字实现运行时多态,其本质由虚函数表(vtable)支持,每个含有虚函数的类会生成一个虚函数表指针(_vptr)。关键点包括:派生类可继承虚性,建议使用override确保正确重写;纯虚函数强制子类实现;虚析构函数确保正确析构链。多重继承时,每个基类子对象拥有独立的vptr和vtable。实际应用中,虚函数与非虚成员共存,需注意内存布局。虚函数机制是C++实现动态多态的核心,理解其原理对面试和开发都至关重要。

2025-07-09 21:36:23 1068

原创 我的Leetcode刷题笔记:栈和队列

数据结构结构特点操作方式STL 实现类栈 Stack后进先出(LIFO)队列 Queue先进先出(FIFO)双端队列 Deque两端可进出优先队列 PriorityQueue自动排序队列(堆)🧩题目名称:设计一个支持获取最小值的栈使用两个栈:一个正常存储所有元素;一个辅助栈实时维护当前“最小值”;每次 push/pop 都要判断是否更新辅助栈;所有操作时间复杂度 O(1)。栈/队列问题的本质是**“顺序控制”与“范围控制”**;

2025-07-09 09:14:41 472

原创 我的Leetcode刷题笔记:字符串

总结了LeetCode字符串相关题型的解题思路与技巧,涵盖5类常见问题:字符串拆分替换、单词反转、字符串轮转、字符串转整数和有效数字判断。重点解析了路径加密和动态密码更新的实现方法,提供了C++代码示例和复杂度分析。对于字符串转整数(myAtoi)问题,详细说明了处理步骤,包括跳过空格、符号处理、数字转换和溢出检查。所有方案均注重边界条件处理,时间复杂度一般为O(n),空间复杂度从O(1)到O(n)不等。这些方法适用于面试准备和算法练习,强调标准化流程与高效实现。

2025-07-08 09:59:22 1024

原创 讨论QString的各种to

Qt字符串编码与转换指南 核心要点 字符编码基础:UTF-8是可变长度编码(1-4字节),UTF-16固定2/4字节,GBK是中文专用编码 QString特性:内部使用UTF-16存储,支持国际化字符 关键转换方法 编码转换:提供toUtf8()(网络/文件)、toLocal8Bit()(本地系统)、toLatin1()(西欧字符) 数值转换:包括toInt()、toDouble()等,可带成功状态检测 C++兼容:toStdString()转换为标准库字符串 应用场景建议 跨平台:优先使用UTF-8 本地

2025-07-07 14:01:46 641

原创 我的Leetcode刷题笔记:数组

我的Leetcode数组刷题指南

2025-07-07 10:59:47 1126

原创 我的LeetCode刷题指南:链表部分

我的Leetcode链表刷题笔记概论

2025-07-06 12:22:19 756

学术英语词汇表-U1..pdf

学术英语词汇表-U1..pdf

2022-09-27

空空如也

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

TA关注的人

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