- 博客(122)
- 资源 (1)
- 收藏
- 关注
原创 智能指针
文章摘要智能指针是C++中管理动态内存的重要工具,通过RAII(资源获取即初始化)机制自动释放资源,避免内存泄漏。传统手动管理内存的方式在异常发生时容易导致资源未释放,而智能指针如unique_ptr、shared_ptr和weak_ptr通过引用计数或独占所有权的方式解决这一问题。shared_ptr支持多对象共享资源,但需注意循环引用问题,可通过weak_ptr打破循环。此外,智能指针的线程安全性仅针对引用计数操作,资源访问仍需额外同步。C++11的智能指针基于Boost库改进,提供了更安全、便捷的内
2025-05-23 22:37:05
437
原创 网络基础概念
TCP/IP协议的本质是一种解决方案TCP/IP协议能分层,前提是因为问题们本身能分层截至到目前,我们还没解除过任何协议,但是如果朴素的理解协议,我们已经可以试试了。OS源代码一般都是用C/C++语言写的下面,我们可以看看这个图问题:主机B能识别data,并且准确提取a=10,b=20,c=30吗?回答:答案是肯定的!因为双方都有同样的结构体类型struct protocol。也就是说,用同样的代码实现协议,用同样的自定义数据类型,天然就具有"共识",能够识别对方发来的数据,这不就是约定吗。
2025-05-17 21:45:08
891
原创 线程同步与互斥
某些类,只应该具有一个对象(实例),就称之为单例。例如一个男人只能有一个媳妇。在很多服务器开发场景中,经常需要让服务器加载很多的数据(上百G)到内存中,此时往往要用一个单例的类来管理这些数据。
2025-05-14 21:49:41
87
原创 C++高性能内存池
这个项目是实现一个高并发的内存池,他的原型是google的一个开源项目tcmalloc,tcmalloc全称Thread--Caching Malloc,即线程缓存的malloc,实现了高效的多线程内存管理,用于替代系统的内存分配相关的函数(malloc,free)。我们这个项目是把tcmalloc最核心的框架简化后拿出来,模拟实现出了一个自己的高并发内存池,目的就是学习tcmalloc的精华。
2025-05-06 21:47:49
1395
1
原创 线程概念与控制
在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个内部的控制序列”一个进程至少都有一个执行线程线程在进程内部运行,本质是在进程地址空间运行在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流。
2025-05-04 23:03:04
172
原创 简单谈谈AI
码字不易,大家就当可怜可怜我,看看吧。当ChatGPT第一次用流畅的人类语言与我对话时,我忽然意识到:这个看似“聊天”的程序背后,正酝酿着一场足以改变人类文明进程的技术革命。今天的AI不再是科幻电影里面的概念,而是正在渗入我们生活每个毛孔的真实存在。让我们剥开技术术语的外壳,用最朴实的方式聊聊这场变革如何重塑我们的世界。
2025-04-20 02:29:17
554
原创 Linux进程信号
上⾯所说的所有信号产⽣,最终都要有OS来进⾏执⾏,为什么?OS是进程的管理者• 信号的处理是否是⽴即处理的?在合适的时候• 信号如果不是被⽴即处理,那么信号是否需要暂时被进程记录下来?记录在哪⾥最合适呢?• ⼀个进程在没有收到信号的时候,能否能知道,⾃⼰应该对合法信号作何处理呢?已经知道怎么处理了,要么忽略,要么默认,大部分信号是默认。• 如何理解OS向进程发送信号?能否描述⼀下完整的发送处理过程?发信号的本质就是修改位图,不再叫发信号,更喜欢叫写信号。信号忽略&&信号默认exit(1);
2025-03-29 21:10:17
124
原创 C++11
左值是一个表示数据的表达式(如变量名或解引用的指针),我们可以获取它的地址+可以对它赋值,左值可以出现赋值符号的左边,右值不能出现在赋值符号左边。定义时const修饰符号的左值,不能给他赋值,但是可以取它的地址。左值引用就是给左值的引用,给左值取别名。
2025-03-20 18:38:14
71
原创 VMWare的下载安装以及Linux镜像的安装配置
本博客涉及VMWare的下载安装,Ubuntu、Centos、OpenEuler的镜像的下载以及安装配置和xshell的下载安装配置并且连接Linux虚拟机、以及在Linux环境下怎么下载安装开发工具,怎么写代码,怎么配置调试工具,希望可以帮助到大家。由于Centos停更了,所有这里我们就使用Ubuntu,其实两者差距不是很大,命令都是差不多一样的,只是有的配置文件存放的地方不一样,所以这里不必纠结,Ubuntu的群体大多数都是学生,而且Ubuntu的图形化界面做的也很好,最适合新手学习。
2025-03-13 15:06:48
76
原创 MySQL环境搭建
将MySQL Server依次展开会看到一个是x64,另一个是x86,x64是64位,x86是32位,然后选中,点击箭头移动到右边,然后点击下一步。
2025-03-10 00:12:32
770
原创 进程间通信
进程间通信(Inter-Process Communication,IPC)是指运行在同一台计算机或不同计算机上的多个进程间进程数据交换和通信的技术。由于每个地址都有自己的地址空间,它们无法直接访问彼此的数据,因此需要通过特定的机制来实现通信。IPC是操作系统和多进程编程中的一个重要概念,广泛应用于分布式系统,多任务操作系统以及各种应用程序之间。
2025-03-05 22:56:52
128
原创 库制作与原理
库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。静态库.a[Linux]、.lib[windows]动态库.so[Linux]、.dll[windows]// ubuntu 动静态库// C//C++// Centos 动静态库// C// C++静态链接的出现,提高了程序的模块化水平。
2025-02-15 23:26:04
151
原创 Ext系列文件系统
code-hard和code.c的inode值居然是一样的,硬链接,本质不是一个独立的文件,因为它没有独立的inode,硬链接本质是一组新的文件名和目标inode number的映射关系。2就是多了一个新的文件名指向目标文件,这个2叫做硬链接数。(在inode属性中存在引用计数)对文件进行备份!!!dir有两个文件名指向这个目标文件,一个是dir,另一个是dir目录下的"."那么我再在dir里面创建一个文件夹,那么它就会变成3。因为hello中有个..指向该目标文件。“.”和".."是硬链接。
2025-02-14 01:18:02
81
原创 基础IO
pathname: 要打开或创建的⽬标⽂件flags: 打开⽂件时,可以传⼊多个参数选项,⽤下⾯的⼀个或者多个常量进⾏“或”运算,构成flags。参数:O_RDONLY: 只读打开O_WRONLY: 只写打开O_RDWR : 读,写打开这三个常量,必须指定⼀个且只能指定⼀个O_CREAT : 若⽂件不存在,则创建它。需要使⽤mode选项,来指明新⽂件的访问权限O_APPEND: 追加写返回值:成功:新打开的⽂件描述符失败:-1缓冲区是内存空间的一部分。
2025-02-11 21:45:49
108
原创 进程控制
一个进程进入僵尸,代码和数据以及页表可以释放,但是PCB不能释放,所以退出码以及信号都放在了PSB中,然后父进程去调用系统接口,然后将值设置进父进程传的地址中,这样父进程就有可以拿到子进程的退出信息了。一个是库函数,一个是系统调用,上下层的关系,exit函数是语言上的,而exit要想终止程序必须调用_exit这种系统接口,只有调用操作系统提供的接口,它才能终止进程。当然,我们可以让子进程死循环,那么父进程就一直等待,然后杀掉子进程,父进程获取到的信号就为9,此时退出码无意义。(查看进程的退出码)
2025-02-09 03:45:51
78
原创 进程概念
在系统当中查找一个最合适调度的进程的时间复杂度是一个常数,不随着进程增多而导致时间成本增加,我们称之为进程调度O(1)算法!现在我们就可以理解为什么有NI值了?比如我的程序在运行的时候我修改优先级,那么到底该放在活跃进程还是过期进程,只能等程序跑完往过期进程中放的时候根据nice值的修改放。
2025-02-07 15:48:24
100
原创 自动化构建-make/Makefile
我们前面说了,clean被.PHONY修饰了,那么这个clean就是伪目标,那么什么是伪目标呢?从我们执行结果可以看到,make只能执行一次,而make clean总是被执行,第一次编译main.c形成了main,第二次还想编译的时候其实没必要再编了,因为main.c没有被修改,也就是说这个可执行程序所依赖的源文件没有任何修改,就没有重新编的必要了,再重新编不就浪费时间吗,如果我今天的项目中存在1000个.c,我全部编译了需要花一个小时,一个小时刚编完,不小心又执行了一次make,难道再编一个小时吗?
2025-02-03 02:08:23
89
原创 用哈希表封装myunordered_map和myunordered_set
SGI-STL30版本源代码中没有unordered map和unordered set,SGl-STL30版本是C++11之前的STL版本,这两个容器是C++11之后才更新的。unorder_map要支持[]主要需要修改insert返回值支持,修改HashTable中的insert返回值为pair<Iterator,bool> Insert(const T& data)。
2025-01-31 02:31:21
80
原创 哈希表实现
当key是string/Date等类型时,key不能取模,那么我们需要给HashTable增加一个仿函数,这个仿函数支持把key转换成一个可以取模的整形,如果key可以转换为整形并且不容易冲突,那么这个仿函数就用默认参数即可,如果这个Key不能转换为整形,我们就需要自己实现一个仿函数传给这个参数,实现这个仿函数的要求就是尽量key的每值都参与到计算中,让不同的key转换出的整形值不同。从译名来看,有散乱排列的意思。{19,30,5,36,13,20,21,12,24,96}等这一组值映射到M=11的表中。
2025-01-30 15:26:29
190
原创 unordered_map和unordered_set的使用
unordered_set的声明如下,Key就是unordered set底层关键字的类型。unordered set默认要求Key支持转换为整形,如果不支持或者想按自己的需求走可以自行实现支持将Key转成整形的仿函数传给第二个模板参数。unordered set默认要求Key支持比较相等,如果不支持或者想按自己的需求走可以自行实现支持将Key比较相等的仿函数传给第三个模板参数。unordered_set底层存储数据的内存是从空间配置器申请的,如果需要可以自己实现内存池,传给第四个参数。
2025-01-28 01:12:23
105
原创 封装红黑树实现mymap和myset
map要支持[]主要需要修改insert返回值支持,修改RBtree中的insert返回值为pair<Iterator,bool> Insert(const T& data)。SGI-STL30版本源代码,map和set的源代码再map/set/stl_map.h/stl_set.h/stl_tree.h等几个头文件中。map和set的实现结构框架核心部分。
2025-01-27 00:53:02
289
原创 红黑树实现
如果p是g的左,c是p的右,那么先以p为旋转点进行左单旋,再以g为旋转点进行右单旋,再把c变黑,g变红即可。c为红,p为红,g为黑,u不存在或者u存在且为黑,u不存在,则c一定是新增节点,u存在且为黑,则c一定不是新增节点c之前是黑色的,是在c的子树中插入,符合情况1,变色将c从黑色变成红色,更新上来的。c为红,p为红,g为黑,u不存在或者u存在且为黑,u不存在,则c一定是新增节点,u存在且为黑,则c一定不是新增,c之前是黑色的,是在c的子树中插入,符合情况1,变色将c从黑色变成红色,更新上来的。
2025-01-25 22:48:09
225
原创 AVL树实现
通过图7和图8可以看到,左边高时m,如果插入位置不是在a子树,而是插入在b子树,b子树高度从h变成h+1,引发旋转,右边单旋无法解决问题,右单旋后,我们的树依旧不平衡。右单旋解决的纯粹的左边高,但是插入在b子树中,10为根的子树不再是单纯的左边高,对于10是左边高,但对于5是右边高,需要用两次旋转才能解决,以5为旋转点进行一个左单旋,以10为旋转点进行一个右单旋,这棵树就平衡了。我们实现的AVL树是否合格,我们不应该去检查平衡因子,平衡因子是随着值的插入而改变的,那如果平衡因子也是错误的呢?
2025-01-22 00:22:16
199
原创 异常
程序这样写还是不对的,因为srrsy2也有可能抛异常,array1如果抛异常的话就不需要释放什么资源,直接到外面去了,array2如果抛异常的话要释放array1,Divide如果抛异常要释放array1和array2,array2抛异常,再去捕获吗?有时catch到一个异常对象后,需要对错误进行分类,其中的某种异常错误需要进行特殊的处理,其他错误则重新抛出异常给外层调用链处理。就可以把捕获的对象直接抛出。这里的话我没就会用到智能指针,智能指针就是可以很好的解决这块的问题,抛异常就会自动释放内存。
2025-01-02 20:20:37
231
原创 Linux环境基础开发工具使用
这样的代码确实可以现实的倒计时程序,但是如果我将cnt的初始值9改成10的话,该程序就会出问题,当我在向显示器上打印1234的时候显示器上的是字符1,字符2,字符3,字符4,其实显示器只认字符,所以显示器才叫做字符设备,只不过显示器把字符1234写在了一起,看起来是1234,实则是1234这四个字符,所以c语言中的%d格式化是把整数转字符。vi/vim的区别简单点来说,它们都是多模式编辑器,不同的是vim是vi的升级版本,它不仅兼容vi的所有指令,而且还有一些新的特性在里面。
2024-11-28 23:28:32
627
原创 Git的安装和使用
第一次上传需要填写用户名和密码,如果密码填错,需要在凭证管理器中删除,如果第二次再次上传的话还弹出这个框的话就不用去凭证管理器中删除,不弹的话就得去凭证管理器中删除。注意:这个软件是依赖前一个软件的,在安装的过程中需要选择第一个软件的路径,这里我就不做更改了,默认就行。右击鼠标,选择Git Clone,然后讲自己复制的仓库链接粘贴进去,然后点击ok。首先文件夹中要放我们要上传的文件或者文件夹,我这里就放了一个C语言的代码。点进仓库里面,我们发现里面的文件和我们云端上的文件是一样的。
2024-11-25 23:36:18
2311
原创 map和set的使用
set的声明如下,T就是set底层关键字的类型set默认要求T支持小于比较,如果不支持或者想按自己的需求走可以自行实现仿函数传给第二个模板参数。set底层存储数据的内存是从空间配置器中申请的,如果需要可以自己实现内存池,传给第三个参数。一般情况下,我们都不需要传后两个模板参数。set底层是用红黑树实现,增删查效率是O(logN),迭代器遍历时走的搜索树的中序,所以是有序的。全面部分我们学习了vector/list等容器的使用,STL容器接口设计,高度相似。
2024-11-21 23:25:05
281
原创 IAR下载安装与新建工程
注册使用百度网盘即可享受免费存储空间。为自己要写代码的文件起个名字,以.c结尾,因为写的是C语言,如果看不到.c可以在文件夹中打开文件扩展名。将激活工具中的License中的码赋值到License#中,注意Name和Comparty一定要是英文。右击此电脑查看属性,注意,不是此电脑的快捷方式,也可以进入此电脑右击空白处查看属性。首先找到自己刚刚创建的文件夹,我的是在桌面上,然后为工程起一个名字,点击保存。在里面找到CC2530F256,选上,然后点击打开。0错误,0警告,这个时候就说明我们的工程没有问题。
2024-11-11 02:40:16
1088
原创 多态
多态是一个继承关系的下的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象优惠买票。
2024-11-07 16:13:05
221
1
原创 继承
下面我们看到Person是基类,也称作父类。Student是派生类,也称作子类。(因为翻译的原因,所以既叫基类/派生类,也叫父类/子类))。public、protected、private这三个关键字既可以在类里面修饰我们的成员变量和成员函数,也可以进行继承。
2024-11-03 22:31:15
295
原创 常见指令以及权限理解
目录的可执行权限是表示你可否在目录下执行命令。如果目录没有-x权限,则无法对目录执行任何命令,甚至无法cd 进入目, 即使目录仍然有-r 读权限(这 个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件)。而如果目录具有-x权限,但没有-r权限,则用户可以执行命令,可以cd进入目录。但由于没有目录的读权限。所以在目录下,即使可以执行ls命令,但仍然没有权限读出目录下的文档。
2024-11-02 01:37:34
261
原创 模板进阶
一个程序(项目)由若干哥源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。优先模板复用零代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生增强了代码的灵活性缺陷模板会导致代码膨胀问题,也会导致编译时间变长出现模板编译错误时,错误信息非常凌乱,不易定位错误t=O83Akw=array。
2024-10-26 19:31:38
421
原创 stack和queue
kw=stackkw=queue优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素优先队列中位于顶部的元素。优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素,元素从特定容器的"尾部"弹出,其称为优先队列的顶部。
2024-10-26 19:16:12
386
原创 list
目录1. list的介绍及使用1.1 list的介绍1.2 list的使用(带头双向循环链表) 1.2.1 list尾插及迭代器遍历链表1.2.2 emplace_front1.2.3 erase 1.2.4 swap 1.2.5 splice1.2.6 sort 2. list源码 3. list的模拟实现 3.1 注意点3.1.1 list中的迭代器 3.1.2 const迭代器3.1.3 迭代器的构造 3.1.4 swap接口 3.1.5 size 3.2 知识点3.2.1 oper
2024-10-18 19:13:34
481
原创 双指针_算法
常见的双指针有两种形式,一种是对撞指针,一种是左右指针。一般用于顺序结构中,也称左右指针。left == right (两个指针指向同一个位置)left > right(两个指针错开)又称为龟兔赛跑算法,其基本思想就是使用两个移动速度不同的指针在数组或链表等序列结构上的移动。这种方法对于处理环形链表或数组非常有用。其实不单单是环形链表或者数组,如果我们要研究的问题出现循环往复的情况时,均可考虑使用快慢指针的思想。
2024-10-14 14:49:53
873
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人