- 博客(57)
- 收藏
- 关注
原创 Qt-框架
模块的使用:在项目文件中声明,比如:.pro:QT += core gui widgetsCMake:find_package(Qt6 COMPONENTS Core Gui Widgets REQUIRED)包含头文件,根据需要包含各个模块的头文件在源代码中创建相关的类,就可以使用模块的功能|包含Qt框架的全局定义,包括基本数据类型,函数和宏一般Qt类的头文件都会包含这个头文件,所以用户程序中无须包含这个头文件就可以使用其中的定义。QtGlobal 头文件提供了一些基础的数据类型和宏,这些类型和宏常用于
2026-01-07 07:02:54
627
原创 QT入门看这一篇就够了——超详细讲解
Qt项目的构建过程包含一个预编译环节,将Qt特有的文件转换为标准C++代码,再由编译器处理。核心是元对象系统,它支持信号与槽、运行时类型信息等特性。Q_OBJECT.ui.qrc构建时,MOC、UIC、RCC首先处理各自的文件,生成标准的C++代码。随后,标准C++编译器(如g++)编译所有C++代码,链接Qt库,最终生成可执行文件。
2026-01-07 06:49:37
756
原创 高性能异步任务处理库
并发基础:线程、锁、原子操作、内存模型C++语言特性:模板、lambda、移动语义、完美转发设计模式:单例、RAII、工作窃取、观察者数据结构:无锁队列、双缓冲、批量处理系统编程:缓存优化、内存对齐、系统调用C++新标准:C++17/20特性(if constexpr、std::latch、std::jthread)通过这些技术的有机结合,fastexec实现了一个高性能、可扩展、类型安全的异步任务执行库,是现代C++并发编程的优秀实践。
2026-01-06 07:07:18
915
原创 Linux网络相关
解答:SACK(Selective ACK):允许接收方通知发送方哪些数据段已经成功接收,即使前面的段有丢失。工作原理:示例:SACK对重传的影响:42. 描述Linux的netfilter框架及其在网络编程中的应用解答:netfilter:Linux内核的数据包过滤框架,支持NAT、包过滤、连接跟踪等功能。五个挂载点(hook points):编程示例:应用:解答:MPTCP:允许TCP连接使用多个路径传输数据。Linux内核支持:编程示例:应用场景:解答:SR-IOV(Single
2026-01-05 09:17:48
674
原创 临时。。。
示例:2. 可视化 UI 设计使用 Qt Designer:拖拽组件到窗体上,设置属性、布局和信号槽。布局管理:支持水平布局、垂直布局、网格布局、表单布局等。通过 、、 等类实现。信号与槽机制:使用 函数连接信号和槽。支持自动连接(通过 命名规则)。示例(在 Qt Designer 中):3. 代码化 UI 设计手动创建界面组件:不使用 文件,全部通过代码创建组件和布局。适用场景:动态界面、复杂布局或无法通过可视化设计实现的情况。
2026-01-04 09:15:56
989
原创 CMake知识 上
CMake是一个跨平台的项目构建工具,它通过生成构建系统所需的配置文件来简化编译流程。相比直接编写Makefile,CMake更高效且能自动解决依赖关系。基本使用流程包括创建build目录、运行cmake生成构建文件、执行make编译。CMake支持变量定义、C++标准指定、输出路径设置等功能,并能搜索源文件和包含头文件路径。此外,CMake可生成静态库和动态库,并通过target_link_libraries链接库文件。其核心优势在于跨平台性和配置灵活性,是现代C/C++项目构建的重要工具。
2026-01-02 12:13:26
1117
原创 C++ 可变参数模板、折叠表达式、泛型 Lambda 与引用折叠
可变参数模板是 C++11 引入的,允许模板接受任意数量的模板参数,使用参数包来表示n(n>=0)个模板参数。lambda 本身不能直接是模板(C++20 之前。允许在 Lambda 表达式中使用。作为参数类型,使得 Lambda 成为模板函数对象。一个小样例:获取用户输入的一串数据,中的整形数据。表示递归处理除第一个参数外的剩余参数。(..., 表达式)(表达式, ...)
2026-01-01 19:05:13
463
原创 阿里云简单配置gdb+git
改端口后,要去阿里云控制台的安全组设置里,开放你刚设的端口(比如22222),否则下次就进不来了。第一次推送可能需要一点时间。完成后,刷新你的仓库页面,就能看到代码了。然后到代码平台上创建“合并请求”,等同事审查后合并到主分支。打开Xshell或其他SSH工具,填写这些信息,点击连接。拿到服务器后,为了连接它。开头的文字,就是公钥。
2026-01-01 15:47:48
593
原创 C++11并发编程
工具核心用途一句话比喻创建和管理线程。雇佣工人。std::mutexlock_guard保护共享数据,防止同时访问。厕所的门锁。线程间等待特定条件成立。餐厅等位叫号器。无锁的简单共享变量操作。不可分割的自动动作。std::async最简单的方式启动异步任务。叫一次性的外卖。在线程间精确传递一次结果。单次使用的快递包裹。将任务打包,便于存储和传递。写好待寄的快递单。
2025-12-26 19:09:08
1003
原创 摸鱼ai-
请简单介绍一下你在广东幻方科技有限公司的实习经历。“好的。我在广东幻方科技公司担任C++开发工程师,参与了通信机柜智能门锁系统的后端开发与维护工作,实习期一共14个月。这个系统主要是为数据中心、通信基站等场所提供智能门禁管理。我主要负责三个核心模块:第一是设备通信模块,用C++实现门锁设备与服务器间的TCP通信,包括协议解析和状态同步。第二是本地数据管理,用SQLite存储设备配置和用户权限,提供C++接口供上层调用。第三是配合测试和硬件团队进行联调,修复Bug并编写技术文档。
2025-12-26 18:50:54
883
原创 分布式RPC网络框架
mprpc是一个基于C++开发的轻量级RPC框架,它整合了muduo网络库的高性能I/O模型和Protobuf的高效序列化能力。框架的设计目标是提供简单易用、高性能的远程调用解决方案,支持服务自动注册与发现。核心特性高性能网络通信:基于muduo的Reactor多线程模型高效序列化:使用Protobuf进行二进制数据序列化服务治理:集成Zookeeper实现服务注册与发现配置化:支持配置文件动态加载异步日志:记录框架运行状态在RPC调用中,客户端需告诉服务端三要素服务名:如方法名:如Login。
2025-12-04 11:18:11
831
原创 常见问题及回答
定义内存泄漏是指程序在堆上通过new或malloc分配了内存,但使用完毕后未调用delete或free释放,导致该内存无法被系统回收。长期积累会耗尽可用内存,引发性能下降甚至程序崩溃。避免方法:将资源管理封装在对象生命周期中。使用智能指针(C++11 起)::独占所有权:共享所有权:解决循环引用避免裸newdelete:尽量使用容器(如)或智能指针管理动态内存。“内存泄漏是指堆上分配的内存未被释放,长期积累导致内存耗尽。避免方法包括:使用 RAII 原则、优先用智能指针(如。
2025-12-03 21:58:14
647
原创 线程池设计与实现
线程池通过复用线程减少创建/销毁开销,提升系统性能。设计采用Fixed模式(固定线程数)和Cached模式(动态伸缩)相结合。核心流程包括任务提交、双条件变量协调、信号量同步结果和优雅停机机制,涉及RAII锁、类型擦除等技术。项目曾出现析构死锁和跨平台差异问题,通过gdb分析线程堆栈定位解决。该设计解决了多线程编程的资源竞争、死锁等关键问题,构建了高性能并发基础设施。
2025-12-03 21:46:32
394
原创 ProtoBuf安装
如果使用centOS环境,yum源带的g++最新版本是4.8.5,发布于2015年,年代久远。编译该项目会出现异常。将gcc/g++升级为更高版本可解决问题。
2025-11-19 11:21:47
177
原创 智能指针 (C++)
智能指针通过RAII模式自动管理内存资源,解决了手动内存管理中的野指针、内存泄漏等问题。主要分为三种:unique_ptr实现独占所有权,只能移动不能拷贝;shared_ptr通过引用计数实现共享所有权,适用于容器和资源传递;weak_ptr辅助shared_ptr解决循环引用问题,不增加引用计数。智能指针确保资源在作用域结束时自动释放,有效提升了内存安全性和代码健壮性。
2025-09-29 10:00:24
364
原创 Linux多线程[生产者消费者模型]
本文介绍了信号量机制及其在多线程同步中的应用,重点探讨了生产者消费者模型的实现。首先阐述了信号量的概念,将其比喻为公共自行车亭的资源管理系统,通过P/V操作控制资源访问。随后分析了互斥锁、条件变量和信号量的区别与适用场景。接着详细讲解了生产者消费者模型的特点和优点,包括高效性、灵活性和低耦合性。最后展示了基于环形队列的实现方案,提供了Task任务类和主程序代码示例,演示了多生产者多消费者场景下的线程同步机制。
2025-08-25 19:22:38
894
原创 socket与udp
定义在头文件中,其核心作用是存储 IPv4 协议的地址信息,包括IPport协议族等。在 socket 编程中,很多函数(如bind()connect()recvfrom()等)需要接收一个sockaddr类型的指针作为参数,而是sockaddr针对IPv4的 “具体化” 实现。
2025-08-04 11:31:59
1041
原创 C++11 右值引用与Lambda表达式
传统的C++语法中就有引用的语法,而C++11中新增了的右值引用语法特性,所以从现在开始我们之前学习的引用就叫做左值引用。无论左值引用还是右值引用,都是给对象取别名。那么什么是左值?什么是左值引用?左值是一个表示数据的表达式(如变量名或解引用的指针),我们可以获取它的+可以对它,左值可以出现赋值符号的左边,右值不能出现在赋值符号左边。定义时const修饰符后的左值,不能给他赋值,但是可以取它的地址。左值引用就是给左值的引用,给左值取别名。
2025-07-28 10:45:44
1945
原创 C++11范围for 初始化列表 auto decltype
本文介绍了C++11的几个重要新特性:1) auto自动类型推导,可通过初始化值自动推断变量类型;2) decltype关键字,可直接获取表达式类型用于变量定义;3) 列表初始化{}语法,为内置类型和自定义类型提供统一安全的初始化方式;4) 范围for循环,简化容器遍历操作;5) 智能指针(未展开)。这些特性使C++代码更简洁安全,提升了开发效率,其中列表初始化还能用于STL容器赋值和自定义类构造。
2025-07-25 10:19:30
1014
原创 AVL平衡二叉树
AVL树是一种自平衡二叉搜索树,通过平衡因子(左右子树高度差≤1)确保操作效率为O(log n)。其节点结构包含三叉链(父、左、右指针)、键值对和平衡因子。插入操作分为四步:1)空树直接插入;2)搜索位置;3)链接新节点;4)平衡调整(更新平衡因子并旋转)。旋转分为四种情况:左单旋(右子树过深)、右单旋(左子树过深)、左右双旋和右左双旋。代码实现时需注意空指针检查和根节点更新。AVL树通过严格平衡保证高效查找,适用于需要频繁查询的场景。
2025-07-11 16:55:50
694
2
原创 Linux线程同步/互斥
本文主要探讨了多线程编程中的资源共享问题及解决方案。当多个线程并发访问共享变量(如计数器)时,由于非原子操作和指令交错,可能导致数据不一致(如预期结果200000,实际小于该值)。通过引入临界区、互斥锁等机制,可以确保线程安全访问。互斥锁通过原子性操作实现资源保护,但会带来性能损耗,因此需控制加锁粒度。文章还分析了线程切换时机,并提供了互斥锁的API使用方法及封装示例,强调合理使用锁机制对多线程程序稳定性的重要性。
2025-07-09 17:42:20
1005
原创 Linux线程控制
由于用户并不会直接使用轻量级进程的接口,于是 需要借助第三方库进行封装,类似于用户可能不了解系统提供的 文件接口,从而方便使用。当程序运行时,原生线程库需要从磁盘加载至内存中,再通过进程地址空间映射至共享区中供线程使用。可以看到五个线程打印“同一个”临时变量的地址并不相同,足以证明线程独立栈的存在。线程之间共享全局变量,对全局变量进行操作时,会影响其他线程。修饰,修饰之后,全局变量不再存储至全局数据区,而且存储至线程的局部存储区中。的起始地址就表示当前线程的 ID,地址是唯一的,因此线程。
2025-07-08 18:10:18
1346
原创 mysql索引
文章摘要 索引是提高数据库查询效率的关键机制,通过空间换时间的方式优化数据检索。本文系统介绍了索引的基础概念、工作原理及实现方式: 索引本质:类似书籍目录,通过预排序和存储关键信息,使数据库无需全表扫描即可快速定位数据。 索引必要性:数据量越大,索引价值越显著,百万级数据查询性能可提升数十倍。 索引类型:包括普通索引、唯一索引、主键索引和联合索引等,各有适用场景。 底层实现:基于磁盘存储特性(扇区/柱面)和I/O优化(16KB页大小),通过B+树结构组织数据页和目录页,实现高效查找。 B+树原理:多级目录页
2025-07-07 17:08:16
1404
2
原创 二叉排序树
本文介绍了二叉排序树的基本性质和操作实现。二叉排序树具有以下特性:左子树节点值小于根节点,右子树节点值大于根节点,左右子树也均为二叉排序树。其平均时间复杂度为O(log n),最坏情况为O(n)。文章详细讲解了二叉排序树的数据结构设计,包括节点结构和树结构,并提供了三种核心操作的实现方法:查找操作采用遍历比较方式;插入操作需处理空树和值比较情况;删除操作最为复杂,需区分叶子节点、单子节点和双子节点三种情况,其中双子节点删除时需找到右子树最小节点进行替换。各操作均配有代码实现和详细注释。
2025-06-30 20:07:16
452
原创 mysql表操作与查询
本文介绍了SQL中表的基本操作和查询语句。主要内容包括:1) 表的创建、修改、复制等操作,重点讲解了CREATE TABLE语法、数据类型、列约束和表约束;2) 基础查询操作,详细说明了SELECT语句的执行顺序及各子句的用法,包括选择列、表连接、WHERE条件筛选(比较运算符、逻辑运算符、范围查询、NULL判断、模糊查询等)。文章通过具体代码示例演示了各类SQL操作,为数据库初学者提供了实用的参考指南。
2025-06-27 20:09:35
1315
原创 C++多态
本文系统介绍了C++中的多态特性。多态是指同一操作作用于不同对象产生不同行为,其核心在于接口与实现分离、可扩展性和代码复用。在C++中主要通过虚函数重写和继承实现多态,需满足基类指针/引用调用虚函数且子类重写虚函数两个条件。文章详细讲解了虚函数、虚函数重写(含协变和虚析构函数)、final/override关键字、重载/重写/重定义的区别、抽象类概念,并深入分析了多态的实现原理(虚函数表和虚函数指针)。这些机制共同构成了C++运行时多态的基础,使程序具有更好的灵活性和可维护性。
2025-06-21 22:51:34
1051
原创 C++继承
C++继承机制解析 继承是C++面向对象编程的核心特性,实现了代码复用和多态基础。通过继承,子类自动获得父类能力并发展自身特性,但无法访问父类私有成员。继承方式包括public、protected和private,影响成员的可见性,其中public继承最常用。子类与父类存在赋值兼容规则,允许子类对象赋值给父类,但反向操作需强制类型转换。继承中同名成员会隐藏父类成员,可通过作用域运算符访问。构造函数调用遵循基类到子类的顺序,析构则相反。菱形继承会导致数据冗余和二义性,可通过虚继承解决。虚继承使用指针存储偏移量
2025-06-20 21:09:40
1371
原创 list使用及模拟
list是支持常数时间内任意位置插入删除的序列容器,具备双向迭代能力。其底层为双向链表结构,各元素存于独立节点,通过指针指向前后元素。与forward_list的主要区别:后者是单链表,仅支持单向迭代,结构更简单高效。相比array、vector、deque等序列容器,list在任意位置插入/删除元素的效率更优。缺陷:不支持随机访问(如访问第6个元素需线性迭代),且因节点存储额外信息,对存储小元素的大列表可能更占空间。
2025-06-13 20:33:37
796
原创 vector使用及模拟
可变数组容器vector是动态数组,支持随机访问,大小可自动扩展连续存储:与数组一样使用连续内存,下标访问高效,但支持动态扩容动态扩容机制:插入新元素时可能重新分配更大的数组,将原元素迁移至新数组,避免频繁扩容空间分配策略:分配额外空间应对增长,扩容间隔按对数增长,确保尾部插入操作的时间复杂度为 O (1)空间换时间:通过预分配冗余空间减少扩容次数,以额外内存开销换取高效动态增长性能特性:随机访问效率极高,尾部插入 / 删除高效,中间操作效率较低;迭代器和引用稳定性优于list。
2025-06-07 15:23:19
1124
原创 Linux线程初识
在一个程序里的一个执行路线就叫做线程(thread更准确的定义是:线程是“一个进程内部的控制序列”一切进程至少都有一个执行线程线程在进程内部运行,本质是在进程地址空间内运行在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流。
2025-06-05 22:04:04
884
原创 Linux进程信号
生活中的信号类比(交通信号灯、警报),当产生这些信号时,我们会立马想到对应的动作。在Linux中,信号是事件发生对进程的通知机制亦称软件中断,由操作系统内核、进程本身或者其他进程向目标进程异步事件发送机制(即收到某种信号,并不会立马去执行)。pending集是信号产生后的暂存区,block是控制信号是否能从pending暂存区递交给进程的开关。信号产生后会稍后递达给某进程,信号在产生和到达期间会一直处于pending等待状态。信号,内核向进程通知且递送一次,(编号34-64)为。位为1生效,0不生效。
2025-06-01 18:06:19
1980
原创 共享内存-systemV
共享内存是一个允许多个进程直接访问同一块物理内存区域的进程通信工具,因其本身不涉及用户态与核心态之间转换,故效率最佳。写入数据 (e.g., sprintf(shm_ptr1, "Hello"))读取数据 (e.g., printf("%s", shm_ptr2)):成功返回共享内存的起始地址指针,失败返回。:用于存储或修改共享内存属性的结构体(返回内存指针 shm_ptr1。**返回值:**蔡成功返回一个。:成功返回0,失败返回 -1`:成功返回共享内存标识符。:成功返回0,失败返回。
2025-05-31 14:31:34
1035
原创 String类使用及模拟
介绍了C++中string类的基本概念、构造函数和析构函数的使用方法,并通过示例代码演示了多种构造方式。重点讲解了string类的拷贝构造和赋值运算符重载的模拟实现,分析了浅拷贝带来的问题及解决方法。此外,还详细展示了如何实现operator[]操作符重载,确保对字符串元素的正确访问。文章通过代码示例和图示帮助理解string类的底层实现原理和使用技巧。
2025-05-27 20:22:16
1791
原创 进程通信(匿名管道+命名管道)
进程通信工具分为数据传输工具和共享内存两类。这里我们讨论进程通信工具(IPC)里面的管道、system V和共享内存。在理解阶层通信之间,我们先了解用户空间缓冲区和内核空间缓冲区两个概念。
2025-05-26 23:22:19
1694
原创 Linux--初识文件系统fd
本文主要介绍了Linux文件系统中的关键概念和操作,包括C/系统调用文件操作、ext2文件系统结构、超级块、块组描述符表、位示图、文件描述符、重定向、inode、数据块、缓冲区以及软硬链接。ext2文件系统通过块组管理文件,超级块和块组描述符表提供文件系统的元数据,位示图记录inode和块的分配状态。文件描述符用于标识和访问已打开的文件,inode存储文件的元数据,数据块存储文件的实际内容。缓冲区用于提高数据读写效率,分为全缓冲、行缓冲和无缓冲。软硬链接的区别在于软链接创建新的inode,而硬链接则共享同一
2025-05-23 20:02:32
1389
原创 模板(template)初识
如果模板函数和非模板函数都存在且相同情况下,优先调用非模板函数,而不是调用模板函数实例化的函数(优先选择更快的方式)在编译器编译阶段,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用,无须手动干预自动完成。非模板函数可以和同名的函数模板同时存在,且该函数模板还可以被实例化为这个非模板函数。编译器在代码中遇到模板使用时自动生成对应的实例,无需手动声明。用不同类型的参数使用函数模板时,称为函数模板的实例化。类模板名字不是真正的类,而实例化的结果才是真正的类。手动指定生成特定类型的模板函数。
2025-05-19 21:15:39
339
原创 C++内存管理
二者为全局函数,new和delete在底层分别调用operator new和operator delete全局函数来申请空间。动态内存分配:指在程序运行时,根据需求在堆空间申请和释放一段连续的地址空间(频繁分配/释放导致内存不连续),且需手动计算字节数。申请空间成功就直接返回,否则执行用户提供的空间不足应对措施,如果用户提供该措施就继续申请,否则就抛异常。操作符,申请和释放连续的空间,使用。申请和释放单个元素的空间,使用。申请和释放的是单个元素的空间,如果申请的是内置类型的空间,申请的是连续空间,而且。
2025-05-19 08:45:21
793
原创 printf函数参数与入栈顺序
C标准未规定参数求值顺序。大多数编译(GCC、Clang)默认从右往左入栈顺序,这样可以支持…表示向右对齐占m列,左边不足补空格,输出字符只占n位,超出n位删去。调用printf("Value: %d", 42)无`\0`满足条件时刷新(如缓冲区满、遇到\n)不同编译器可能出现不同的结果。,支持多种数据类型和格式控制。显示"Value: 42"格式化字符串并写入缓冲区。
2025-05-18 21:47:49
1189
原创 Linux下可执行程序的生成和运行详解(编译链接汇编图解)
首先,程序从高级语言到可执行文件经历了预处理、编译、汇编和链接四个步骤,其中链接阶段涉及动态库和静态库的使用。接着,文章解释了操作系统如何通过fork创建子进程,并通过execve系统调用加载ELF文件,替换进程地址空间并执行程序。最后,程序从_start入口跳转到main函数执行。整个过程通过COW(写时复制)技术优化了内存使用,确保子进程的失败不会影响父进程。
2025-05-16 15:25:34
1633
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅