
C/C++
文章平均质量分 65
毛毛不怕困难
这个作者很懒,什么都没留下…
展开
-
STL中的哈希表(unordered_map和unordered_set内部使用的数据结构)
在unordered_map和unordered_set中,数据的存储与管理主要依赖于哈希表这种数据结构。原创 2025-03-14 14:35:20 · 610 阅读 · 0 评论 -
什么是左值引用和右值引用?
左值引用,右值引用,移动语义,完美转发原创 2025-03-14 14:16:43 · 103 阅读 · 0 评论 -
static_cast/dynamic_cast/reinterpret_cast/const_cast
主要用于在具有继承关系的类之间进行安全的指针或引用转换,特别是当涉及到向上、向下或侧向转换时。其他三种类型转换各有其特定场景:适用于基本类型的转换及可预见安全性的类间转换。提供了更为激进的类型转换,适用于底层编程需求。const_cast专门用于添加或移除const和volatile属性。原创 2025-03-04 16:35:35 · 339 阅读 · 0 评论 -
字符编码检测
将一串字符或数据与0x80进行按位与操作,通常是为了检查该字符或数据的最高位是否为 1。这在字符编码、标志位检测以及某些数据处理场景中非常常见。原创 2024-09-09 21:59:43 · 442 阅读 · 0 评论 -
内存泄漏检测组件的实现
内存泄漏是在没有自动GC的编程语言里面,经常发生的一些问题。原创 2024-01-19 20:45:14 · 1043 阅读 · 0 评论 -
C语言实现读写锁和try...catch逻辑
代码示例创建了多个读者线程和一个写者线程来访问共享资源(这里是一个文件)。在读者线程中,使用了文件I/O函数打开文件、映射文件到内存,并对文件内容进行了读取。在写者线程中,也使用了文件I/O函数打开文件、映射文件到内存,并对文件内容进行了写入。完整代码如下,简洁易懂。原创 2024-01-13 19:41:02 · 829 阅读 · 2 评论 -
内存池的实现场景分析
本文中所介绍的内存池主要是先判断需要的内存是多大,然后,大于指定的最大值的话,那么需要重新给分配一大块,存储这一大块的结构体所占用的内存是从内存池中分配的,就是便利遍历的池子看是否有满足要求的;然后如果需要的内存小于指定值,那么就是去内存池中,遍历链表,然后找到满足需要内存要求的块,分配内存给他即可。总的来说,个人觉得这个内存池的实现就是使得每次申请者需要的内存不多时,直接去内存池拿,不需要再去进行系统调用。如果实际开发需要的话,也可以去使用一些开源的内存池组件tcmalloc/jemalloc等。原创 2024-01-09 20:54:14 · 447 阅读 · 0 评论 -
基础组件:手写一个线程池(C语言版)
线程池(消费者)线程池中的线程取出任务,执行任务,线程调度(mutex+condition)队列(任务:任务的上下文,任务执行函数)那么怎样确定线程池中的线程数量?构成:生产者线程(发布任务)原创 2023-12-04 21:14:30 · 490 阅读 · 0 评论 -
reactor模式的一些总结
必须使用非阻塞IO,边缘触发的话,在一次事件循环要把readbuffer读空,如果不读空,只有在下次事件触发才能读取剩下的。如果此时readbuffer已经为空了,但是我们使用的是阻塞IO的话,此时程序就会被阻塞。:当某个socket的接收缓冲区有新数据分节到达,然后select 会报告这个socket描述符可读,但是,协议栈检验时,将数据丢弃了,那么此时调用read将无数据可读,如果此时socket设置为阻塞,则会阻塞线程。检测IO就是检测IO的就绪状态,也就是 IO多路复用(检测多个连接的就绪状态)原创 2023-12-02 20:06:51 · 978 阅读 · 1 评论 -
百万并发的reactor网络模型
并发量是指系统在同一时间内能够处理的请求数量,它主要关注的是系统能够同时处理多少个请求。而吞吐量则是指在一定时间内,系统能够处理的请求总数,它更关注的是系统整体的处理能力。下面是百万并发reactor网络模型的代码实现,实测连接的并发量可达100W以上,可以基于此模型构建对应的应用。很多朋友在网络编程时,在对代码测试时,分不清并发量和吞吐量的关系。把对网络IO的处理装换为对事件的处理,进行封装。原创 2023-11-27 10:42:19 · 419 阅读 · 0 评论 -
异步请求池的框架(以DNS请求为例)
0x010x05。原创 2023-11-27 10:22:25 · 431 阅读 · 0 评论 -
练手:实现一个C++线程池
之前学习了:可变参数;bind等C++11特性,下面用这些重点知识等实现一个C++线程池。这部分代码如果无法理解,可以参考往期的博文。下面是使用该线程池的测试代码。原创 2023-10-15 16:11:36 · 128 阅读 · 1 评论 -
C++新特性复习四:STL标准库
STL容器,可将其分为四类:序列容器、有序关联容器、无序关联容器、容器适配器序列容器:** 无序关联容器**容器适配器:序列容器描述了线性的数据结构(也就是说,其中的元素在概念上” 排成一行"), 例如数组、向量和 链表。关联容器描述非线性的容器,它们通常可以快速锁定其中的元素。这种容器可以存储值的集合或 者键-值对。栈和队列都是在序列容器的基础上加以约束条件得到的,因此STL把stack和queue作为容器适配器来实现,这样就可以使程序以一种约束方式来处理线性容器。原创 2023-09-23 13:53:51 · 77 阅读 · 1 评论 -
C++11多线程thread
下面以 std::mutex 为例介绍 C++11 中的互斥量用法。std::mutex 是C++11 中最基本的互斥量,std::mutex 对象提供了独占所有权的特性——即不支持递归地对 std::mutex 对象上锁,而 std::recursive_lock 则可以递归地对互斥量对象上锁。std::mutex 的成员函数构造函数,std::mutex不允许拷贝构造,也不允许 move 拷贝,最初产生的 mutex 对象是处于unlocked 状态的。lock(),调用线程将锁住该互斥量。原创 2023-09-25 15:55:56 · 217 阅读 · 1 评论 -
C++之function和bind用法
C++11特性function和bind的用法原创 2023-09-26 15:02:48 · 1319 阅读 · 0 评论 -
C++新特性复习二:右值引用和移动语义
可以从2个角度判断:左值可以取地址、位于等号左边;而右值没法取地址,位于等号右边。int a = 6;a可以通过 & 取地址,位于等号左边,所以a是左值。6位于等号右边,6没法通过 & 取地址,所以6是个右值。int a_;A a = A();同样的,a可以通过 & 取地址,位于等号左边,所以a是左值。A()是个临时值,没法通过 & 取地址,位于等号右边,所以A()是个右值。原创 2023-09-18 11:50:09 · 97 阅读 · 0 评论 -
C++新特性复习一:智能指针
C++里面3个智能指针:shared_ptr,unique_ptr, weak_ptr 其中后三个是C++11支持几个指针的特点:unique_ptr独占对象的所有权,由于没有引用计数,因此性能较好。shared_ptr共享对象的所有权,但性能略差。weak_ptr配合shared_ptr,解决循环引用的问题。原创 2023-09-14 10:38:40 · 147 阅读 · 1 评论 -
C++新特性复习三:lambda表达式
如果捕获列表为[&],则表示所有的外部变量都按引用传递给lambda使用;如果捕获列表为[=],则表示所有的外部变量都按值传递给lambda使用;匿名函数构建的时候对于按值传递的捕获列表,会立即将当前可以取到的值拷贝一份作为常数,然后将该常数作为参数传递。原创 2023-09-20 07:41:51 · 96 阅读 · 1 评论 -
B/B+树
/ 这是一个B树数据结构的定义。它包含了一个结构体_btree_node,该结构体表示B树的节点,并具有以下属性: // keys:保存节点中的关键字的数组。这里定义为int类型的指针,表示一个动态数组。// childrens:保存子节点的数组。这里定义为指向_btree_node结构体的指针的指针,表示一个动态数组。// num:节点中已存储的关键字数量。// leaf:一个标志位,指示该节点是否为叶子节点。// 另外,还定义了一个结构体_btree表示整个B树,包含一个指向根节点的指针。原创 2023-08-18 15:14:31 · 87 阅读 · 1 评论 -
C/C++后台开发岗位技能知识树
一.语言对象的生命周期,垃圾回收标准库错误与异常处理日志分析,断点调试对面向对象的理解设计模式GDB的使用二.数据结构和算法链表,队列,栈二叉树,红黑树B树,B+树dijistra算法,最小生成树递归排序 希尔,归并,快排,堆排序贪心算法,动态规划跳表,散列表,hash,布隆过滤器三.数据库MySQLMySQL安装配置SQL建表,索引,存储过程存储引擎 MyISAM/Innodb数据库连接池异步数据库请求SQL注入,webshell数据库集群,分库原创 2023-07-09 17:18:00 · 231 阅读 · 1 评论 -
C++ substr用法
在上面的代码中,我们使用substr函数从字符串str中提取从第7个字符开始到末尾的子串,并将其存储在字符串sub中。然后我们输出这个子串,得到"world!它有两个参数:起始位置和子串长度。请注意,如果起始位置或长度超出范围,则会抛出一个异常。原创 2023-03-09 17:02:11 · 4146 阅读 · 1 评论