- 博客(77)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 高并发内存池【tcmalloc】
是在计算机技术中经常使用的一种设计模式,其内涵在于:将程序中需要经常使用的核心资源 先申请出来,放到一个池内,由程序自己管理,这样可以提高资源的使用效率,也可以保证本程 序占有的资源数量。经常使用的池技术包括内存池、线程池和连接池等,其中尤以内存池和线程 池使用最多。内存池内存池(Memory Pool) 是一种动态内存分配与管理技术。通常情况下,开发者习惯直接使 用newdeletemallocfree。内存池则是在真正使用内存之前,,再次申请池可以再取出来使用,并尽量与周边的空闲内存块合并。
2024-04-12 20:22:31
1003
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 【项目】Http服务器
HTTPServer项目是一个基于C++编写的简单的HTTP服务器实现,用于处理客户端的HTTP请求并提供相应的服务。该项目使用了Socket编程来实现服务器与客户端之间的通信,通过监听指定的端口并接受客户端连接,然后解析HTTP请求并生成对应的HTTP响应。HTTPServer项目是一个简单而完整的HTTP服务器实现,适合于学习和理解基本的网络编程和HTTP协议处理原理,也可以作为基础框架进行扩展,实现更复杂的功能和应用场景。开发环境:Linux-Centos7 + vscode。
2024-04-02 21:14:09
1286
原创 【内网穿透】使用frp进行内网穿透
内网穿透(NAT 穿透)是一种技术,用于使处于局域网(内网)中的设备或服务可以被外部网络访问。由于局域网设备通常使用私有 IP 地址,这些地址在互联网上是不可路由的,因此需要内网穿透技术来实现外部访问。简单来说,比如你家里有台服务器且没有公网IP。你在学校或者公司想要访问服务器,由于没有公网,你是访问不了的。内网穿透解决的就是上面这个问题。归根到底还是公网IP不足的问题。
2024-07-21 16:55:50
717
原创 【Qxlxs】打包成库供项目使用
Github地址:https://github.com/QtExcel/QXlsx使用将项目下载到本地,下载到本地后,主要使用。
2024-07-14 21:18:19
214
原创 【C++】类型转换
在 C++ 中,显示转换(Explicit Type Conversion)是通过使用不同的类型转换操作符来实现的,每种操作符都有其特定的用途和适用条件。用于编译时类型转换。支持较宽泛的转换,如整数之间的类型转换、相关类型的指针或引用转换(但不涉及底层 const 属性的转换)、向上和向下的类层次转换(但不进行运行时类型检查)。可能引发未定义行为,慎用。不能用于在不相关的类之间进行转换。用于将一个指针转换为另一个类型的指针,或者将一个指针转换为一个整数类型,反之亦然。
2024-07-02 21:13:15
1034
原创 【MySQL】 -- 用户管理
如果我们只能使用root用户,这样存在安全隐患。这时,就需要使用MySQL的用户管理。创建出非root用户,限制其权限。权限这个概念拿出来就是用来限制非root用户的。这样从技术手段上保证了数据的安全性和完整性,防止有人删库跑路,把核心的库删除了。有了权限后,不同职责的人所负责的库不同,大大的提高了数据库的安全性。
2024-06-20 19:46:42
727
原创 【MySQL】 -- 视图
MySQL视图(Views)是MySQL中的虚拟表,它是基于一个或多个表的查询结果集。视图本身并不存储数据,而是根据查询语句动态生成数据。,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。视 图的数据变化会影响到基表,基表的数据变化也会影响到视图。基表指的是在创建视图时使用的实际数据表。在创建视图时,视图的数据来源于一个或多个基表。
2024-06-19 21:23:06
334
原创 【MySQL】 -- 事务
只要输入begin或者,事务便必须要通过commit提交,才会持久化,与是 否设置无关。事务可以手动回滚,同时,当操作异常,MySQL会自动回滚对于InnoDB每一条SQL语言都默认封装成事务,自动提交。select有特殊情况,因为 MySQL 有 MVCC )如果没有设置保存点,也可以回滚,只能回滚到事务的开始。直接使用 rollback(前提是事务 还没有提交)。如果一个事务被提交了(commit),则不可以回退(rollback)可以选择回退到哪个保存点InnoDB支持事务,
2024-06-18 21:00:03
580
原创 【Git】--Part4--多人协作
⾸先,可以试图⽤推送⾃⼰的修改;如果推送失败,则因为远程分⽀⽐你的本地更新,需要先⽤ git pull 试图合并;如果合并有冲突,则解决冲突,并在本地提交;没有冲突或者解决掉冲突后,再⽤推送就能成功!一般建议在push之前,先使用pull合并一下最新的代码,然后解决冲突,再进push。功能开发完毕,将分⽀merge进main,最后删除分⽀。合并的时候,再dev和mian分支来回切换合并,这样虽然麻烦,但是最大力度保证了main分支的安全。
2024-06-18 12:00:20
402
原创 【Git】--Part3--远程操作 & 配置 & 标签管理
Git 是分布式版本控制系统,同⼀个Git仓库,可以分布到不同的机器上。怎么分布呢?最早,肯定只有⼀台机器有⼀个原始版本库,此后,别的机器可以这个原始版本库,⽽且每台机器的版本 库其实都是⼀样的,并没有主次之分。你肯定会想,⾄少需要两台机器才能玩远程库不是?但是我只有⼀台电脑,怎么玩?其实⼀台电脑上也是可以克隆多个版本库的,只要不在同⼀个⽬录下。不过,现实⽣活中是不会有⼈在⼀台电脑上搞⼏个远程库玩,因为⼀台电脑上搞⼏个远程库完全没有意义,⽽且硬盘挂了 会导致所有库都挂掉。
2024-06-17 20:20:14
789
1
原创 【Git】 -- Part2 -- 分支管理
⽀在实际中有什么⽤呢?你准备开发⼀个新功能,但是需要两周才能完成,第⼀周你写了50% 的代码,如果⽴刻提交,由于代码还没写完,不完整的代码库会导致别⼈不能⼲活了。如果等代码全部写完再⼀次提交,⼜存在丢失每天进度的巨⼤⻛险。现在有了分⽀,就不⽤怕了。你创建了⼀个属于你⾃⼰的分⽀,别⼈看不到,还继续在原来的分⽀上正常⼯作,⽽你在⾃⼰的分⽀上⼲活,想提交就提交,直到开发完毕后,再⼀次性合并到原来的分⽀ 上,这样,既安全,⼜不影响别⼈⼯作。
2024-06-17 11:32:29
421
原创 【Git】 -- Part1 -- 基础操作
安装完Git后,首先要做的事情是设置你的 和 地址。这样在你向仓库提交代码的时候,就知道是谁提交的,以及提交人的联系方式。设置完成后,可以使用查看你配置的信息。创建 Git 本地仓库,创建⼀个 Git 本地仓库对应的命令为 。以下操作是在Linux系统中,以命令行的方式进行的。创建本地仓库成功后,使用就可以在此目录下看到一个隐藏目录。这个目录是用来跟踪管理仓库的,一般不用修改这个目录里面的文件,否则Git仓库可能会被破坏。从远程拉取一个项目的时候,就会有这个目录。从远程拉取下来的项目,就是已经初始
2024-06-14 17:26:26
582
原创 MySQL索引
往往IO效率低下的最主要矛盾不是IO单次数据量的大小,而是IO的次数。为了减少IO的次数,所以提高了单次IO的字节数,磁盘的基本单位都是512字节,将一个很大的磁盘,分为若干个以512字节为单位的内存,然后使用特定的数据结构管理这些小内存块。但是,也可以看到,现在的页模式内部,实际上是采用了链表的结构,前一条数据指向后一条数据,本质上还是通过数据的逐条 比较来取出特定的数据。正是因为有序,在查找的时候,从头到后都是有效查找,没有任何一个查找是浪费的,而且,如果运气好,是 可以提前结束查找过程的。
2024-06-05 21:52:24
905
原创 Chromium源码学习(1)—— 拉取源码,编译
Chromium项目于2008年发布,作为Google Chrome浏览器的开源部分。Google的Chrome浏览器基于Chromium开发,但添加了Google品牌、自动更新、内置Flash播放器、PDF阅读器等一些闭源的功能和服务。除了Chorm,近几年微软大火的Edge浏览器也是基于Chromium进行开发的。Chromium开源项目有活跃的社区和丰富的学习资源,官方也有详细的开发者文档,涵盖了从环境设置到代码贡献的各个方面。Chromium官方网站。
2024-05-29 16:53:04
1895
原创 Chromium 源码学习-----UI界面
简单总结就是:Widget对应着一个原生的窗口,而View对应着窗口里面的一个控件,如容器,Button,Tab等等。这样在Widget和View之上,Chrome搭建起了自己跨平台的皮肤引擎。这点是和Qt是非常相似的。在chromium源码中,负责管理工具栏(红框区域)的类就是负责管理应用菜单按钮的(绿色区域)的类就是负责管理应用菜单按钮的子项(蓝色区域)的类就是后续如果要修改对应的模块,在对应管理该模块的类下进行修改即可。
2024-05-29 14:34:49
1461
原创 MySql表的增删查改(CRUD)
由于临时表和测试表的结构相同,并且select进行的是全列查询,因此在插入时不用在表名后指明column列表。上述SQL会先将表中的数据按照部门号进行分组,然后各自在组内做聚合查询得到每个组的平均工资和最高工资。截断表就是删除表中的所有数据,会删除表中的所有行,并释放表所占用的存储空间,但保留表的结构。但是null是0是1,也是未定义的,和0和1比较的结果都是1。当查询一个未知表的时候,这个表可能很大,查询全表的时候容易导致数据库卡死。创建临时表的时候,使用like用原表的结构创建临时表。
2024-05-08 19:43:08
1065
原创 MySql数据类型
数据类型定义了数据在数据库中的存储格式,包括数据的大小、范围、精度等。不同的数据类型具有不同的存储要求。MySQL 支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。
2024-05-07 15:35:12
384
原创 MySql库和表的操作
如果创建数据库时未指明数据库的编码格式或校验规则,则默认使用MySQL配置文件中对应的编码格式或校验规则。一般默认都是utf-8。一般编码格式指定后,校验规则也会自动设定的。指定校验规则在创建数据库时添加COLLATE选项即可。查看系统默认的字符集。查看系统默认的校验规则。查看数据库支持的字符集查看数据库支持的校验规则。
2024-05-06 16:37:02
899
原创 MySql数据库(概念篇)
什么是数据库数据库见名之意,就是用来存储数据的仓库,是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。没接触数据库之前,一般都是将数据存储在文件中。比如execl文件,word文件中。总的来说数据库相比文件更适合于处理复杂的、多用户访问的数据,并且能够提供更高的安全性、性能和灵活性。为了解决这个问题,大佬们就设计出了一种更加利于管理数据的东西->数据库。它能更能高效的管理数据。
2024-05-06 11:12:17
734
1
原创 多路转接IO
常见的多路转接技术有 select、poll 和 epoll,它们都是在 Linux 系统中使用的。Select特点:最古老的一种多路转接方式,在 UNIX 系统中广泛使用。优点:跨平台支持良好,适用于小规模的 I/O 操作。缺点:效率低下,无法处理大量的文件描述符。适用场景:适用于小规模的 I/O 操作,对性能要求不高的情况。Poll特点:较 Select 更高效。优点:提供了更高的效率,能够处理大量的文件描述符。缺点:随着文件描述符数量的增加,性能仍会下降。适用场景。
2024-04-30 14:43:20
732
原创 Qt窗口
Qt 窗⼝ 是通过 QMainWindow类 来实现的。 QMainWindow 是⼀个为⽤⼾提供主窗⼝程序的类,继承⾃ QWidget 类,并且提供了⼀个预定义的 布局。 包含 ⼀个菜单栏(menu bar)、多个⼯具栏(tool bars)、多个浮动窗⼝(铆 接部件)(dock widgets)、⼀个状态栏(status bar) 和⼀个 中⼼部件(central widget),它是许多应 ⽤程序的基础,如⽂本编辑器,图⽚编辑器等。如下图为 QMainwindow 中 各组件所处的位置:一个窗口中只能
2024-04-28 21:24:07
792
原创 UNIX环境高级编程->高级IO(概念篇)
这篇文章主要介绍五种IO模型,分别是:IO,就是Input(输入),Output(输出)的简称。 最简单的使用C语言调用函数时,就是向显示器输出数据。调用函数时,就是从标准输入键盘读入数据。这就是最基本的IO,一般称之为标准IO。还有一些文件IO。比如,。这些函数,从文件中输入或者向文件中输出时,这也是IO操作,一般称之为文件IO。在比如网络中套接字中的,这些函数,从socket套接字中输入或者输出时,都是IO操作,一般称之为网络IO。而应用层在调用,,这些函数时,本质是把数据从用户层拷贝到操作系统内核层
2024-04-25 14:28:12
731
原创 C++ 类和对象(3)
在之前的文章中介绍过C++中的关于构造函数并没有完全介绍完 这篇文章继续研究c++的构造函数简单回顾一下之前介绍过构造函数的特征。
2024-04-18 14:11:31
339
原创 结构体内存对齐
vs系列的编译器默认对齐数是8,不是所有编译器都有默认对齐数,当编译器没有默认对齐数的时候,成员变量的大小就是该成员的对齐数。比如上面结构体S,在vs编译器下,默认对齐数是8。在整个结构体对象内存中。d是第一个成员,对齐到结构体对象的首地址即可。c要对齐到1的整数倍,i要对齐到4的整数倍。图解:d从起始地址占8个字节即可,c对齐1的整数倍,占1个字节即可。i要对齐到4的整数倍,占4个字节。然后确定整个结构体对象的总大小。最大对齐数的整数倍,也就是8的整数倍。
2024-04-18 14:09:30
321
原创 并发编程模型-生产者消费者模型
生产者消费者模型是一种并发编程模型,用于解决多线程或多进程间的数据共享和同步问题。在这个模型中,有两种角色:生产者和消费者,它们通过共享的缓冲区进行通信。生产者负责生成数据并将其放入缓冲区,而消费者则从缓冲区中获取数据并进行处理。生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而共享的缓冲区进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给缓冲区,消费者不找生产者 要数据,而是直接从缓冲区取,平衡了生产者和消费者的处理能力。
2024-04-07 16:35:42
382
原创 C++智能指针
智能指针是一种用于管理动态分配内存的对象,可以在内存不再需要时自动释放。智能指针通过重载了指针操作符的类来实现,以模拟指针的行为,但具有自动资源管理的功能。
2024-04-07 11:43:56
519
原创 单例模式
将该类的构造函数设置为私有即可,因为子类对象构造时,必须先调用父类构造,构造父类那一部分成员。单例模式指的就是一个类只能创建一个对象,该模式可以保证系统中该类只有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。单例对象创建后一般在整个程序运行期间都可能会使用,所以我们可以不考虑单例对象的释放,程序正常结束时会自动将资源归还给操作系统。因此,将单例实例保存在静态成员变量中能够满足单例模式的要求,确保了实例的全局可访问性和唯一性。释放操作只能调用一次,单检查加锁足够了,无需双检查加锁。
2024-03-24 16:55:41
926
原创 算法->位运算
编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为。利用n&(n-1)从最高位开始统计位1的个数,将结果存放到vector中即可。,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。n & (n-1)每次可以干掉二进制中最右侧的1。指的是这两个数字对应二进制位不同的位置的数目。,计算并返回它们之间的汉明距离。实现一个算法,确定一个字符串。
2024-03-09 16:57:24
520
原创 线程互斥与同步
对临界资源的保护,是每一执行流都要遵守的,也就是说多线程要访问临界,每一个线程都必须要先申请锁,并且这些线程看到的是同一个互斥量。
2024-03-04 15:48:52
762
原创 C++ STL -->模拟实现string
模拟实现的目的就是为了更好的使用STL默认成员函数构造函数无参构造函数:构造空字符串 空字符串里面是有一个\0的 并不是什么都没有带参构造函数函数声明:注意 这里缺省值只能给函数声明,定义的时候不能再使用缺省值实现:析构函数这里的构造函数用new从堆区申请空间,所以析构函数需要自己实现去主动释放资源,编译器默认生成的无法满足需求拷贝构造函数这里如果使用编译器默认生成的拷贝构造函数去初始化对象 在对象生命周期结束时 c++编译器自动调用析构函数会出错 如下图原因:这里是浅拷贝 s1和
2024-03-01 08:31:54
302
原创 算法->哈希表
给定一个整数数组nums和一个整数目标值target,请你在该数组中找出target的那整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。
2024-02-28 08:47:55
868
原创 C++11右值引用
左值引用左值引用只能引用左值,不能引用右值const左值既可以引用左值,也可以引用右值右值引用右值引用只能引用右值,不能引用左值但是右值引用可以move以后的左值。
2024-02-23 17:02:59
998
1
原创 哈希表&&哈希桶(C++实现)
顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,。顺序查找时间复杂度为O(N),平衡树中为树的高度,即 O(log2N),搜索的效率取决于搜索过程中元素的比较次数。。如果构造一种存储结构,通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立 一一映射的关系,那么在查找时通过该函数可以很快找到该元素。该方式即为哈希(散列)方法,哈希方法中使用的转换函数称为哈希(散列)函数,构造出来的结构称 为哈希表(Hash Table)(或者称散列表)。
2024-02-16 19:16:00
754
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人