- 博客(103)
- 收藏
- 关注
原创 【算法】递归(成员变量和按值传递的不同用法)
path作为参数传递下去,每层递归会自动帮我们回溯(函数压栈的原理):当所有递归层需要维护同一份路径,或者复制成本较高时最好设为成员变量。当变量数据较小,而且每条递归路径都需要独立副本时,适合按值传递。:path作为成员变量传递,需要回溯。
2026-07-18 11:31:02
170
原创 【C++/项目】随机数的生成(用于消息或任务ID)
注意:这只是“UUID 外形”的自定义编号,并不是严格符合 RFC 标准的 UUID。如果只是用于项目中的 RocketMQ 消息 ID、日志追踪 ID或任务 ID,一般可以使用;如果外部接口明确要求标准 UUID,应该使用专门的 UUID 库。作用:生成一个类似 UUID 格式的唯一字符串,通常可以用作消息 ID、请求 ID、任务 ID。我们要生成的是8个0~255之间的数字,所以要限定数字区间。用上面的方法生成一个机器随机数,效率较低。通过梅森旋转算法生成一个伪随机数。
2026-07-15 11:57:32
308
原创 【Qt】控件(二) (geometry及与frameGeometry的区别)
而 geometry(),width(),height(),rect(),size() 则是按照不包含 window frame 的方式来计算的。其中 x(),y(),frameGeometry(),pos(),move() 都是按照包含 window frame 的方式来计算的。运行程序,可以看到,按下下方的四个按钮,就会控制target的左上角的位置,对应的按钮整体尺寸也会发生改变。执行程序,可以看到,构造函数中,打印出的geometry和frameGeometry是相同的。
2026-07-04 18:30:38
318
原创 【Qt】控件(一) (QWidget概述和enabled)
Widget是Qt中的核心概念,英文原义是"小部件",我们此处也把它翻译为"控件"。控件是构成一个图形化界面的基本要素。像上述示例中的,按钮,列表视图,树形视图,单行输入框,多行输入框,滚动条,下拉框等,都可以称为"控件"。Qt作为一个成熟的GUI开发框架,内置了大量的常用控件。这一点在Qt Designer中就可以看到端倪。并且Qt也提供了"自定义控件"的能力,可以让程序员在现有控件不能满足需求的时候,对现有控件做出扩展,或者手动创建出新的控件。
2026-07-02 08:59:46
494
原创 【Git】原理及使用(八) (企业级开发模型)
我们知道,一个软件从零开始到最终交付,大概包括以下几个阶段:规划、编码、构建、测试、发布、部署和维护。最初,程序比较简单,工作量不大,程序员一个人可以完成所有阶段的工作。但随着软件产业的日益发展壮大,软件的规模也在逐渐变得庞大。软件的复杂度不断攀升,一个人已经hold不住了,就开始出现了精细化分工。如下图所示:但在传统的IT组织下,开发团队(Dev)和运维团队(Ops)之间诉求不同:• 开发团队(尤其是敏捷团队)追求变化• 运维团队追求稳定双方往往存在利益的冲突。
2026-07-02 08:35:27
220
原创 【Git】原理及使用(七) (多人协作 [下])
但天有不测风云,你的小伙伴突然生病了,需求还没开发完,需要你帮他继续开发,于是他便把feature-2分支名告诉你了。这时,你的小伙伴已经修养的差不多,可以继续进行自己的开发工作,那么他首先要获取到你帮他开发的内容,然后接着你的代码继续开发。当前我们已经删除了远程的几个分支,使用 git branch -a 命令可以查看所有本地分支和远程分支,但发现很多在远程仓库已经删除的分支在本地依然可以看到。此时,在本地,你看不见他新建的文档,他看不见你新建的文档。你和你的小伙伴可以继续在不同的分支下进行协同开发了。
2026-07-01 11:16:29
283
原创 【Git】原理及使用(六) (多人协作 [上])
一下,在同一分支下进行多人协作的工作模式通常是这样:• 首先,可以试图用git push origin branch-name推送自己的修改;• 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;• 如果合并有冲突,则解决冲突,并在本地提交;• 没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!• 功能开发完毕,将分支merge进master,最后删除分支。
2026-07-01 09:53:08
172
原创 【Git】原理及使用(五) (配置git和标签管理)
在日常开发中,有些文件不想或者不应该提交到远端,比如保存了数据库密码的配置文件,可以让Git识别并忽略它们,只需在Git工作区根目录创建特殊的.gitignore文件,将需要忽略的文件名填入,Git就会自动跳过这些文件。在我们使用Git期间,有些命令敲的时候着实让人头疼(太长了),幸运的是,git支持对命令进行简化。它的作用是:commit id 冗长难记,而 tag 可设置简洁有意义的名称,需要回退至重要版本时,直接使用标签就能快速定位对应提交。所以,打错的标签可以在本地安全删除。
2026-06-18 17:34:45
207
原创 【Git】原理及使用(四) (远程操作)
可以理解成:每个人电脑上都有一份完整的代码仓库,包括所有版本历史,而不是只依赖一台中央服务器。在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,因为可能两人不在一个局域网内,两台电脑互相访问不了。因此,分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。Git 就是典型的分布式版本控制系统。
2026-06-17 19:18:52
286
原创 【Qt】信号和槽(三) (断开连接和lambda函数)
lambda表达式本质是一个匿名函数,主要在回调函数中进行使用。通常是一次性的,也可以用auto识别函数类型,延长生命周期进行调用。示例:ambda除了可以按照传值捕获[button],[=]的方式捕获变量,还能按照传引用捕获[&]的方式捕获变量,但Qt中很少用传引用的方式=,因为在Qt中捕获的变量一般是各种控件的指针,指针变量传值或传引用都可以。按引用捕获有致命问题。按引用捕获的变量,需要关注其生命周期。例如,局部指针变量 button 在构造函数结束时就被销毁,可能被置为 nullptr。
2026-06-09 20:42:23
205
原创 【Qt】信号和槽(二) (自定义信号和槽)
基本语法在Qt中,允许自定义信号的发送方以及接收方,即可以自定义信号函数和槽函数。但是对于自定义的信号函数和槽函数有一定的书写规范。1、自定义信号函数书写规范(1)自定义信号函数必须写到"signals"下;(2)返回值为void,只需要声明,不需要实现;(3)可以有参数,也可以发生重载;2、自定义槽函数书写规范(1)早期的Qt版本要求槽函数必须写到"public slots"下,但是现在高级版本的Qt允许写到类的"public"作用域中或者全局下;
2026-06-08 19:54:05
278
原创 【Qt】信号和槽 (一)(概述和基本使用)
Qt中,用户和控件的每次交互过程称为一个事件。"用户点击按钮"是一个事件,"用户关闭窗口"也是一个事件。每个事件都会发出一个信号,例如用户点击按钮会发出"按钮被点击"的信号,用户关闭窗口会发出"窗口被关闭"的信号。Qt中的所有控件都具有接收信号的能力,一个控件还可以接收多个不同的信号。对于接收到的每个信号,控件都会做出相应的响应动作。例如,按钮所在的窗口接收到"按钮被点击"的信号后,会做出"关闭自己"的响应动作;
2026-06-06 19:41:11
253
原创 【Git】原理及使用(三)(分支管理)
在版本回退里,你已经知道,每次提交,Git都把它们串成一条时间线,这条时间线就可以理解为是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。再来理解一下HEAD,HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。每次提交,master分⽀都会向前移动⼀步,这样,随着你不断提交,master分支的线也越来越⻓,⽽HEAD只要⼀直指向master分支即可指向当前分支。
2026-05-28 15:35:04
558
原创 【Git】原理及使用(二) (版本回退)
Git的版本回退速度非常快,因为Git在内部有个指向当前分支(此处是master)的HEAD指针,refs/heads/master文件里保存当前master分支的最新commit id。我们可以继续使用git reset命令,回退到version3版本,但我们必须要拿到version3的commit id去指定回退的版本。之前我们也提到过,Git能够管理文件的历史版本,这也是版本控制器重要的能力。此时,工作区和版本库就不一致了,要删文件,目前除了要删工作区的文件,还要清除版本库的文件。
2026-05-28 11:10:17
383
原创 【Git】原理及使用(一)
创建git本地仓库仓库是进行版本控制的一个文件目录,即Git 仓库是一个被 Git 管理起来的文件夹。Git 会记录这个文件夹里文件的新增、修改、删除历史。我们要想对⽂件进⾏版本控制,就必须先创建⼀个仓库出来。创建⼀个 Git 本地仓库对应的命令为 git init ,注意命令要在⽂件⽬录下执行:配置git当安装Git后首先要做的事情是设置你的用户名称和e-mail地址。命令为:其中 是一个可选项。如果使用了该选项,表示这台机器上所有的 Git 仓库都会使用这个配置。如果你希望在不同仓库中
2026-05-23 15:41:08
447
原创 定长内存池ObjectPool
3.VirtualAlloc函数参数是什么?为什么调之前>>13,调之后<<13,不就相当于直接传吗?这样就相当于从_memory拿走T大小的内存吗?1.为什么不能直接void* next = _freeList;2.为什么_freeList设计成void*类型?
2026-05-09 20:12:14
96
原创 【计网】详解TCP协议(下)
为什么TCP这么复杂?因为要保证可靠性, 同时又尽可能的提高性能.校验和序列号(按序到达)确认应答超时重发连接管理流量控制拥塞控制滑动窗口快速重传延迟应答捎带应答。
2026-05-01 10:08:34
378
原创 【计网】详解TCP协议(上)
主机B会收到很多重复数据. 那么TCP协议需要能够识别出那些包是重复的包, 并且把重复的丢弃掉., 就可以做到去重的效果.我们可以利用前面提到的序列号。它要先回一个 ACK,表示“我知道你要关了”,等自己数据发完后,再单独发 FIN。每一个ACK都带有对应的确认序列号,意思是告诉发送者我已经收到了哪些数据,下一次你从哪里开始发。这种方案允许少量的应答丢失。:不用等超时,TCP 通过重复 ACK 发现可能丢包后,立刻重传丢失的数据包。TCP协议全称“传输控制协议”,即要对数据的传输进行一个详细的控制。
2026-04-29 20:27:58
276
原创 【计网】网络基础
例如htonl表示将32位的长整数从主机字节序转换为网络字节序,例如将IP地址转换后准备发送。如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回;如果主机是大端字节序,这些函数不做转换,将参数原封不动地返回。内存中的多字节数据相对于内存地址有大端和小端之分, 磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分, 网络数据流同样有大端小端之分. 那么如何定义网络数据流的地址呢?一般而言:对于主机, 它的操作系统内核实现了从传输层到物理层的内容;对于路由器, 它实现了从网络层到物理层;
2026-04-28 20:42:53
55
原创 【Linux/多路复用】poll和epoll的使用
1.pollfd结构包含了要监视的event和发生的event,不再使用select“参数-值”传递的方式. 接口使用比select更方便.2.poll并没有最大数量限制 (但数量过大后性能也会下降).:收集在epoll监控的事件中已经发生的事件.例:使用poll监控标准输入。:epoll的事件注册函数.
2026-04-24 16:33:54
85
原创 【项目开发】工厂模式
(Open-Closed Principle, OCP)是面向对象设计里的一个重要原则,意思是:对扩展开放,对修改关闭。意思不是代码永远不能改,而是说:当需求变化、功能增加时应尽量通过新增代码来完成而不是老去改已经稳定的原有代码,这样可以减少对旧功能的影响,降低出错风险。
2026-04-23 09:55:33
243
原创 【Linux/多路复用】select
参数:参数nfds是需要监视的最大的文件描述符值+1;readfds,writefds,exceptfds分别对应于需要检测的可读文件描述符的集合,可写文件描述符的集 合及异常文件描述符的集合.参数timeout为结构timeval,用来设置select()的等待时间。timeout取值:NULL:一直等,select被阻塞,直到某个 fd 就绪0,0:仅检测描述符集合的状态,立即返回,不阻塞其他值:等待指定时间,若在指定的时间段里没有事件发生,select将超时返回。
2026-04-22 20:11:31
236
原创 【MySQL】索引
InnoDB 除了主键索引,用户也会建立辅助(普通)索引,我们以上表中的 Col3 建立对应的辅助索引如下。随着数据量的增大,MySQL中必定会有多个页来存储数据,然后通过指针的方式将所有的page组织起来。用上述图中的方法仍然需要大量的IO,将下一个page加载到内存进行线性检测,显得之前的目录杯水车薪。1.使用一个目录项来指向某一页,而这个目录项存放的是将要指向的页中存放的最小数据的键值。MyISAM同样使用B+树作为索引结果,叶子结点的data域存放的是数据记录的地址。
2026-04-14 19:48:49
3416
原创 【Linux】线程(下)
对于 shared_ptr, 多个对象需要共用一个引用计数变量, 所以会存在线程安全问题. 但是标准库实现的时候考虑到了这个问题, 基于原子操作(CAS)的方式保证 shared_ptr 能够高效, 原子的操作引用计数.A:如果只有一个线程,条件不满足会一直等下去,所以必须要有一个线程通过某些操作,改变共享变量,使原先不满足的条件变满足,并通知等待在条件变量上的线程。条件变量是一种线程同步机制,用于使线程在条件不满足时阻塞等待,并在条件满足时由其他线程唤醒,通常与互斥锁配合使用。存在线程不安全的问题。
2026-03-29 18:03:55
3202
原创 【MySQL】表的操作
field表示列名,datatype表示列的类型,character set 字符集,若没有指定字符集,则以所在所在数据库的字符集为准。插入新字段后,对原来表中的数据没有影响。不同存储引擎创建表的文件不一样。users.firm:表结构。users.MYD:表数据。users.MYI:表索引。
2026-03-29 15:13:02
76
原创 【MySQL】数据库基础和库的操作
用文件保存数据有几个缺点:文件的安全性问题,不利于查询和管理,不利于存储海量数据,不方便用程序控制。为解决以上问题,设计出更利于管理数据的东西——数据库。所谓安装数据库服务器,只是在机器上安装了一个数据库管理系统程序,这个程序可管理多个数据库。为保存应用中的数据,一般会在数据库中创建多个表。MySQL:通常指数据库管理系统(DBMS),也就是管理数据库的软件DB:指 MySQL 里的某一个具体数据库表:数据库里面真正存数据的结构SQL分类DDL。
2026-03-26 16:49:27
360
原创 【Linux】线程(中)
大部分情况下,线程使用的数据是局部变量,在地址空间的线程栈空间内,此时变量归属单个线程,其他线程无法获得。重入:同一个函数被不同的执行流调用,前一个线程没有执行完就有其他线程再次进入,这样的情况称为重入。否则为不可重入函数。指在一组进程(或线程)中各个进程(或线程)均占有不会释放的资源,但因互相申请被其他进程(或线程)所占用的不会释放的资源而处于的一种永久等待状态。调用pthread_mutex_lock时,若互斥量未锁,函数会将其锁定并成功返回,若已被锁,则会陷入阻塞(执行流被挂起),等待互斥量解锁。
2026-01-25 12:06:13
922
原创 【Linux】线程(上)
对于pthreads函数的错误,建议通过返回值判定,因为读取返回值要比读取线程内的errno变量的开销小。:pthread_exit或return返回的指针所指向的内存单元必须是全局的或者malloc分配的,不能在线程函数的栈上分配,因为其他线程得到这个返回指针时线程函数已经退出了。线程以不同的方法终止,通过pthread_join得到的终止状态是不同的。对于Linux目前的实现而言,pthread_t类型的线程ID,本质就是一个进程地址空间上的一个地址。进程的资源分配的基本单位,线程是调度的基本单位。
2026-01-22 12:19:16
612
原创 【C++】特殊类设计
该模式保证系统中该类只有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。由于拷贝只会发生在拷贝构造函数和赋值重载中,所以想要让一个类禁止拷贝只需让该类不能调用以上两种函数即可。扩展delete用法:如果在默认成员函数后面跟上=delete,表示让编译器删除掉该默认成员函数。2.只声明不定义:该函数根本不会被调用,无需做无用功,且能防止成员函数内部拷贝。缺点:可能导致进程启动慢,且如果有多个单例类对象实例时启动顺序不确定。:不管将来用不用,程序启动时就创建一个唯一的实例对象。
2026-01-06 20:07:29
383
原创 【Linux】信号(上)
从上图来看,每个信号只有一个bit的未决标志,非0即1,不记录该信号产生了多少次,阻塞标志也是这样表示的。因此,未决和阻塞标志可以用相同的数据类型sigset_t来存储,sigset_t称为信号集,这个类型可以表示每个信号的“有效”或“无效”状态,在阻塞信号集中“有效”和“无效”的含义是该信号是否被阻塞,而在未决信号集中“有效”和“无效”的含义是该信号是否处于未决状态。信号产生时,内核在进程控制块中设置该信号的未决标志,直到信号递达才清除该标志。2.SIGINT信号产生过,但正在被阻塞,所以暂时不能递达。
2025-12-06 17:27:00
1001
原创 【Linux】【进程间通信】管道
管道匿名管道命名管道POSIX IPC是Unix中最古老的进程间通信的形式。把从一个进程连接到另一个进程的一个数据流称为一个“管道”。
2025-12-02 19:33:54
491
原创 【Linux】【进程间通信】共享内存
共享内存区是最快的IPC形式,一旦这样的内存映射到共享它的进程地址空间,这些进程间的数据传递就不再涉及到内核。进程不再通过执行进入内核的系统调用来传递彼此的数据。
2025-11-28 16:00:16
176
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅
1