- 博客(70)
- 收藏
- 关注
原创 Linux网络初识
TCP/IP协议的本质是一种解决方案TCP/IP协议能分层,前提是因为问题们本身能够分层截止到目前,我们还没接触过任何协议,但是如何朴素的理解协议,我们已经可以试试了。OS源代码一般都是用C/C++语言写的下面,我们来看下面这张图主机B能识别data,并且准确提取a=10b=20c=30 吗?这是肯定的,因为双方都有同样的结构体类型struct protocol。也就是说,使用的是同样的代码来实现协议。
2026-07-26 15:21:45
894
15
原创 哈希密钥:解锁unordered容器的极速潜能
1Key(键类型)用于定义键的数据类型,必须是可哈希可比较的2.Hash(哈希函数类型,默认:std::hash<Key>)将键转换为size_t类型的哈希值,可以使用stl内置的哈希函数,该参数可以缺省,如果用unordered_SET存储自定义数据类型,则需要自己设置哈希函数.3.KeyEqual(键相等比较函数,默认:std::equal_to<Key>)判断两个键是否相等,
2026-04-26 21:07:09
564
16
原创 通信之道:解锁Linux进程间通信的无限可能(三)
消息队列实际上就是在系统中创建了一个队列,队列中的每一个成员都是一个数据块,这些数据块都是由类型和信息两部分构成,两个互相通信的进程通过某种方式看到同一个消息队列,这两个进程向对方发送数据时,都在消息队列的队尾添加数据,这两个进程获取数据块时,都在消息队列的队头取数据块。也就是说,在内核当中只需要将所有的IPC资源的ipc_perm成员组织成数组的样子,然后用切片的方式获取到该IPC资源的起始地址,然后就可以访问该IPC资源的每一个成员了。被保护的共享资源称之为临界资源,临界资源的。信号量的数据结构如下。
2026-04-22 22:19:26
481
16
原创 通信之道:解锁Linux进程间通信的无限可能(二)
在系统当中可能会有大量的进程在进行通信,因此系统当中就可能存在大量的共享内存,那么操作系统就要对其进行管理,因此共享内存除了在内存当中真正开辟空间之外,系统还一定要为共享内存维护相关的内核数据结构.代码运行后,我们可以发现关联失败了,因为我们在使用shmget函数时,没有对创建的共享内存设置权限,所以创建出来的共享内存的默认权限为0,即什么权限都没有,因此进程没有权限关联该共享内存.通过上面创建共享内存的实验可以发现,当进程运行完毕时,申请的共享内存依旧是存在的,并没有被操作系统释放.实际上。
2026-04-18 13:55:01
491
14
原创 通信之道:解锁Linux进程间通信的无限可能(一)
进程间通信简称IPC(Interprocess communication),进程间通信就是在不同进程之间传播或交换信息.
2026-04-05 21:03:21
595
22
原创 类型驱动:解锁Qt模板的渲染潜能
在网页前端开发领域中, CSS是⼀个至关重要的部分. 描述了⼀个的 "样式". 从而起到对网页美化的作用.所谓样式, 包括不限于大小, 位置, 颜⾊, 背景, 间距, 字体等等.现在的网页很难找到没有 CSS 的. 可以说让 "界面好看" 是⼀个刚需.网页开发作为 GUI 的典型代表, 也对于其他客户端GUI开发产生了影响. Qt 也是其中之⼀.Qt 仿照 CSS 的模式, 引入了 QSS, 来对 Qt 中的控件做出样式上的设定, 从而允许程序猿写出界面更好看的代码.
2026-04-04 07:30:00
558
14
原创 代码之锚:洞悉Linux库的打包与复用法则
答案是不需要,因为在后面进程的使用libmyc.so这个动态库之后,它已经被加载到了内存里面,那么如果需要使用动态库的话,首先将自己的代码和数据加载到内存里面,然后将已经加载到内存里面的动态库通过页表映射到自己的地址空间里面.原因在于:动态库要在程序运行的时候,要找到动态库然后加载并运行,那么为什么会找不到动态库的路径呢,因为在编译的时候,告诉了gcc/g++编译器动态库的路径,但是并没有告诉操作系统.PC指针会保存正在执行的指令的下一条指令的地址----->pc指针指向哪里,CPU就去执行哪里的代码。
2026-03-14 12:32:20
1436
26
原创 认知之钥: 解锁软件测试需求与模型的无限潜能
在多数软件公司,会有两部分需求,⼀部分是用户需求,⼀部分是软件需求。1.1:用户需求用户需求:可以简单理解为甲方提出的需求,如果没有甲方,那么就是终端用户使用产品时必须要完成的任务。该需求⼀般比较简略,通常是⼀句话.用户的需求是五花八门,往往只是⼀句话.例如:实现⼀个声控灯,实现⼀个软件的登录功能.
2026-03-10 11:29:58
434
15
原创 键值密钥:解锁 C++ 关联容器的存储潜能
map中的元素总是键值对map中的key是唯一的,并且不能修改默认按照小于的方式对Key进行比较.map中的元素如果用迭代器去进行遍历,可以得到一个有序的序列map的底层为红黑树,查找效率比较高.支持[]操作符,operator[]中实际进行插入查找Multimap是关联式容器,它按特定的顺序,存储由Key和value映射成的键值对<key,value>,其中多个键值对之间的key是可以重复的.在multimap中,通过按照key排序。
2026-03-06 11:55:43
605
12
原创 品控基石: 掌握软件测试的入门密钥
案例⼀举⼀个日常生活案例,商场买衣服,买衣服的整个过程中都伴随着测试行为外观测试:初筛选,走进⻔店,先挑衣服,测试是否存在符合个人审美的⾐服试穿测试:选择尺码,测试试穿之后衣服对个人的外观是否有提升面料测试:纯棉、涤纶、布料....价格测试:询价,心理预期是300以下购买衣服,交易完成.案例二对某款购物软件进行测试启动测试:点击软件图标,测试软件是否可以正常打开.搜索测试:点击输入框,输入关键词,点击搜索.商品测试:点击商品进入详情页.购物测试:点击购买下单成功.案例三。
2026-03-05 14:00:59
485
17
原创 有序之根:掌控二叉搜索树的高效法则
二叉搜索树的删除函数是最难实现的,若是在二叉树当中没有找到待删除结点,则直接返回false表示删除失败即可,但若是找到了待删除结点,此时就有以下。每一个关键码Key,都有与之对应的值Value,即<Key,Value>的键值对。3.它的左子树与右子树叶分别为二叉搜索树.要实现二叉搜索树,我们首先需要实现一个。,该中方法在生活中十分常见。
2026-03-04 11:02:46
426
13
原创 窗口基石:掌控 Qt 界面的无限形态
对话框是 GUI 程序中不可或缺的组成部分。⼀些不适合在主窗口实现的功能组件可以设置在对话框中。对话框通常是⼀个顶层窗口,出现在程序最上层,用于实现短期任务或者简洁的用户交互。QFiledialog(文件对话框)、QColorDialog(颜色对话框)、QFontDialog(字体对话框)、QInputDialog (输入对话框)和 QMessageBox(消息框)。要想自定义对话框,就需要继承自QDialog创建类.通过纯代码的方式来自定义QDialog界面.通过图形化的方式.
2026-02-22 09:00:00
1740
12
原创 基石之力:掌握 C++ 继承的核心奥秘
继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,简称派生类.继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程.以前我们接触的复用都是函数复用,继承是类设计层次的复用//父类/基类public://基类的成员私有private:string _name = "李华";//公有继承public:int _stuid;int _major;
2026-02-12 12:44:00
1081
15
原创 万能钥匙:解锁 C++ 模板的无限可能(二)
一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。优点模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生.增强了代码的灵活性.缺陷模板会导致代码膨胀问题,也会导致编译时间变长.出现模板编译错误时,错误信息会十分凌乱,不容易定位错误.
2026-01-30 12:50:35
764
19
原创 告别浅层调用:深入模拟实现STL Stack/Queue/Priority_Queue,知其所以然
使用正向迭代器适配反向迭代器的时候会认为它两存在对称关系,那么此时就会导致两个问题。
2026-01-25 14:34:50
816
19
原创 C++ STL 容器适配器详解:玩转 Stack (后进先出) 与 Queue (先进先出)
1.stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶被压入和弹出。3. stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下操作:empty:判空操作.back:获取尾部元素操作.
2026-01-20 08:00:00
671
4
原创 深入剖析List的底层实现原理
而一个结点需要存储的信息有:数据、前一个结点的地址、后一个结点的地址,于是该结点类的成员变量也就出来了(数据、前驱指针、后继指针)。因为该结点类只需要根据数据来构造一个结点即可,而结点的释放则由list的析构函数来完成。但是,上面的访问的方式还是有些绕,按照曾经我们学过的方式,我们更偏向于使用 ->的方式来进行访问.先记录当前结点指针的指向,然后让结点指针指向前一个结点,最后返回“自减”前的结点指针。先让结点指针指向前一个结点,然后再返回“自减”后的结点指针。判断这两个迭代器当中的结点指针的指向是否不同。
2026-01-19 00:18:14
760
15
原创 Qt常用控件(三)
这种设定方式其实并不方便. 尤其是界⾯如果内容⽐较多, 不好计算. 而且⼀个窗口大小往往是可以调整的, 按照绝对定位的⽅式, 也无法自适应窗⼝大小. 因此 Qt 引入 "布局管理器" (Layout) 机制, 来解决上述问题.运行程序, 观察代码效果. 可以看到两个按钮之间已经存在了间隔了.调整 QSpacerItem 不同的尺寸, 即可看到不同的间距.⼀个表格控件. ⼀个表格中包含若干行, 每⼀行又包含若干列. 表格中的每个单元格, 是⼀个 QTableWidgetItem。
2026-01-16 10:33:05
945
14
原创 QT常用控件(二)
QAbstractButton中和QRadioButton关系较大的属性.属性说明checkable是否能选中checked是否已经被选中. checkable 是 checked 的前提条件.是否排他.选中⼀个按钮之后是否会取消其他按钮的选中.对于来说默认就是排他的.
2026-01-02 21:30:37
880
24
原创 从零掌握 List:高效操作与性能优化实战
1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。3. list与非常相似:最主要的不同在于是单链表,只能朝前迭代,已让其更简单高效。4.与其他的序列式容器相比(arrayvectordeque)list通常在任意位置进行插入、移除元素的执行效率更好。5.与其他序列式容器相比,list和。
2025-12-15 18:06:12
1276
20
原创 QT常用控件(一)
Widget 是 Qt 中的核⼼概念. 英文原意是 "小部件", 我们此处也把它翻译为 "控件" . 控件是构成⼀个图形化界⾯的基本要素.像上述示例中的, 按钮, 列表视图, 树形视图, 单行输入框, 多行输入框, 滚动条, 下拉框等, 都可以称为 "控件"
2025-12-13 19:52:01
1219
19
原创 深入剖析vector的底层实现原理
start:指向容器的头._end:指向有效数据的尾._endofstorage:指向整个容器的尾部.
2025-12-08 22:03:47
1076
20
原创 Qt中的信号与槽
在Qt中,用户和控件的每次交互过程称为⼀个事件。例如 "用户点击按钮" 是⼀个事件,"用户关闭窗口" 也是⼀个事件。每个事件都会发出⼀个信号,例如用户点击按钮会发出 "按钮被点击" 的信号,用户关闭窗口会发出 "窗口被关闭" 的信号。Qt 中的所有控件都具有接收信号的能力,⼀个控件还可以接收多个不同的信号。对于接收到的每个信号,控件都会做出相应的响应动作.例如,按钮所在的窗口接收到"按钮被点击"的信号以后,会做出"关闭自己"的响应动作;
2025-11-30 14:07:38
1222
19
原创 深入理解 Linux 环境变量与进程地址空间布局
在系统当中查找一个最合适调度的进程的时间复杂度是一个常数,不随着进程增多而导致时间成本增加,我们称之为进程调度O(1)算法!
2025-11-23 18:34:16
1292
18
原创 从零开始:打造属于你的链式二叉树
由于现在大家对二叉树结构掌握还不够深入,为了降低uu们的学习成本,此处手动快速创建一棵简单的二叉树,快速入二叉树操作学习,等二叉树结构了解的差不多时,我们反过头再来研究二叉树真正的创建方式。访问结点所做的操作依赖于具体的应用问题,遍历是二叉树上最重要的运算之一,也是二叉树上进行其它运算的基础.层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第。设二叉树的根节点所在。
2025-11-17 03:22:30
863
13
原创 别再只说“进程”了!深入 Linux 内核看进程如何被调度与管理
就绪状态:如果进程没有入运行队列,那么进程就处在就绪状态.阻塞状态:类似与Linux中的S状态与D状态.运行状态:进程在运行队列中,那么就处于运行状态即Linux中的R状态.终止状态:等价于Linux中的Z状态与X状态(死亡状态).
2025-11-14 14:10:25
1211
15
原创 冯诺依曼体系结构与操作系统
1:冯诺依曼体系结构有的uu会有疑问,先将输入的设备数据交给内存,再由内存将数据交给CPU,这个过程真的比CPU直接从输入设备获取数据更快吗?.虽然内存的大小只有4G/8G/12G/16G等,但是既然内存有大小,那么它就具有预存储数据的能力,而这就是提高冯诺依曼体系结构的核心所在.这里还需要提到根据统计学原理,当一个数据正在被访问时,那么下一次有很大可能会访问其周围的数据.所以当CPU需要获取某一行数据时,内存可以将这一行的数据后面的数据一同加载进来,而,这样下次CPU就可以直接从内存当中获取数据.
2025-11-12 07:30:00
798
3
原创 命令行即生产力:打造你的Linux开发利器
一般来说,大多数的IDE都有这个命 令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。好啦,家人们,关于Linux环境基础开发实现这块的相关细节知识,博主就讲到这里了,如果uu们觉得博主讲的不错的话,请动动你们。的所有指令,而且还有一些新的特性在里面。在命令模式下,ctrl + v-------->hjkl进行区域选择--->包含仅包含//---->只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起, 我就不工作啦。
2025-11-07 20:54:21
1367
3
原创 新手也能懂的 Linux 权限指南
目录的可执行是表示你能否在目录下执行命令.如果没有-x权限,则无法对目录执行任何命令,甚至无法cd进入目录,即使目录依旧有-r读权限而如果目录具有-x权限,但没有-r权限,则用户可以执行命令,可以cd进入目录.但由于没有目录的读权限,因此在目录下,即使可以执行ls命令,但依旧没有读出目录下的文档.好啦,家人们,关于Linux权限实现这块的相关细节知识,博主就讲到这里了,如果uu们觉得博主讲的不错的话,请动动你们滴滴。
2025-11-06 16:41:06
1325
4
原创 揭秘:打造高效日期管理神器——日期类的深度实现
hello,家人们,今天咱们来实现一个日期类,好啦,废话不多讲,开干.在实现日期类之前,首先我们得确定日期类中有哪些函数需要实现滴,那么为了令这个日期类更加得系统化,我们实现一个声明与定义分离的日期类。
2025-11-05 18:02:35
452
3
原创 Qt开发初识
hello,家人们,我们将进入qt初识的学习,好了,废话不多讲,开干!1:Qt实现Hello World(标签实现)在C语言和C++的学习中,我们都是以实现hello world为入门,那么同理,在Qt中也是如此,只不过在Qt中有两种方式实现hello world。
2025-11-05 16:36:47
1211
10
原创 QT背景介绍与环境搭建
Qt 是⼀个跨平台的 C++ 图形⽤⼾界⾯应⽤程序框架。它为应⽤程序开发者提供了建⽴艺术级图形界⾯所需的所有功能。它是完全⾯向对象的,很容易扩展。Qt 为开发者提供了⼀种基于组件的开发模式,开发者可以通过简单的拖拽和组合来实现复杂的应⽤程序,同时也可以使⽤ C++ 语⾔进⾏⾼级开发。指采用图形方式显示的计算机操作用户界面,是计算机与其使⽤者之间的对话接⼝,是计算机系统的重要组成部分。如下分别是:Android ⼿机图形⽤⼾界⾯ 和 IOS ⼿机图形⽤⼾界⾯。
2025-11-02 08:00:00
1136
6
原创 C++ vector使用技巧:高效管理动态数据
1.vector是表示可变大小数组的序列容器。2.就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。3. 本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。
2025-11-01 15:50:06
981
9
原创 深入剖析String类的底层实现原理
即每个对象都有一份独立的资源,不要和其他对象共享。父母给每个孩子都买一份玩具,各自玩各自的就不会有存在任何矛盾.
2024-11-17 18:49:15
1170
39
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅