- 博客(23)
- 收藏
- 关注
原创 Ringbuffer class要注意的点,其实这个类似于vector
类中通过using定义了一系列依赖T的类型别名(前文提到的value_typereference等),这些别名本质是对模板参数T的「包装」,例如// 元素类型 = T// 元素的引用 = T&// 元素的常量引用 = const T&作用:当T变化时(如从int改为),所有依赖T的类型会自动同步,无需修改函数参数 / 返回值的硬编码(如T&改为示例push函数接受参数,当T为int时等价于const int&;当T为时自动变为,实现了「一次编写,适配多类型」。
2025-08-02 02:21:37
591
原创 C++中的alloc与容器之间的关系
内存池优化:通过自定义分配器减少频繁的内存分配和释放开销。特殊内存区域:将容器数据分配到共享内存或特定硬件内存中。调试与统计:跟踪内存分配情况,检测内存泄漏。Allocator和std::allocator_traits在 C++ 中,内存分配器是一个抽象的概念,用于管理动态内存的分配和释放。标准库中的容器(如 std::vector)允许用户传入自定义分配器,以支持不同的内存管理策略(例如池分配、共享内存分配等)。接口不统一。
2025-08-02 01:30:44
535
原创 Ringbuffer
RingBuffer 是一个基于实现的,通过模运算模拟环形结构,支持高效的增、删、改、查操作。以下详细讲解其内部实现,重点聚焦于操作,以及如何管理循环特性。
2025-08-02 01:11:00
483
原创 constexpr —— 编译期常量构造函数
构造函数允许在编译时构造对象。类的成员变量必须全部是字面量类型(如基本类型、数组、其他。是 C++11 引入的关键字,用于表示表达式、函数或对象可以在编译时求值。函数可以在编译时或运行时调用。如果所有参数是编译期常量,函数将在编译时求值。变量必须在编译时确定其值,通常用于定义编译期常量。,可以将计算从运行时转移到编译时,提升程序性能。,可以在编译期完成更多计算,减少运行时开销。并非所有函数都能声明为。
2025-07-31 01:25:34
112
原创 C++ 的名字查找规则(Name Lookup Rules)
理解这些规则有助于避免常见的命名冲突和未定义标识符错误。当标识符包含作用域解析运算符。
2025-07-29 23:17:08
295
原创 ObserverManager
1.内存管理:优先使用智能指针,避免手动管理内存。这里注意一定要使weak_ptr去表示观察者,否则调用观察者的代码的时候可能会出现双重引用的问题。使用vector: 末尾push即可,通知遍历,vector连续存储,内存友好,移除开销大些,但是基本上不多.而且移除的时候基本上也要遍历.3.删除观察者,这个完成了要被查找的元素的删除和无效的观察者的删除(通过remove_if)2.线程安全:在多线程场景中保护观察者列表和通知过程。4.获取所有的观察者(失效的删除)1.选定观察者的数据结构。
2025-07-27 03:34:38
687
原创 Makefile中的一些知识点
在 Makefile 中,变量的赋值可以来源于多种地方。是 GNU Make 中的一个关键字,用来。然后bash执行make的时候传参的时候。通常情况下:Makefile中设置。Makefile 内部定义。命令行传入(优先级更高)那么 Make 会使用。
2025-06-05 15:28:56
206
原创 RFC862 EchoServer
Echo 协议是一种简单的网络协议,设计目的是让客户端向服务器发送数据,服务器将接收到的数据原封不动地返回(回显)给客户端。
2025-05-11 22:31:12
220
原创 ATCHANNEL.c介绍
的主要职责是:通过串口(如)与 modem 进行 AT 命令通信。维护一个读线程负责接收并处理 modem 返回的数据。提供线程安全的接口供上层发送命令并同步等待响应。解析返回结果,包括OKERROR/ 中间响应等。| ATChannel API | ← at_send_command() 等接口| 命令同步机制 + 线程锁 | ← pthread_mutex, condition。
2025-04-30 17:52:25
726
原创 Muduo Logger
往文件写日志的一个常见问题是,万一程序崩溃,那么最后若干条日志往往就丢失了,因为日志库不能每条消息都flush硬盘,更不能每条日志都open/close文件,这样性能开销太大。殊不知如果出现程序死循环拼命写日志的异常情况,那么往往是开头的几条日志最关键,它往往反映了引发异常(busy-loop)的原因(例如收到某条非法消息),后面都是无用的垃圾日志。4. 日志消息的格式是固定的不需要运行时配置,这样可节省每条日志解析格式字符串的开销,好处:使用固定格式的日志,使用脚本好提取,好处理,格式变了,就比较麻烦。
2025-03-09 01:23:13
956
原创 多缓冲技术
这种技术通常用于计算机显示图像,也常用来避免在读写设备不同的情况下使用双端口RAM(DPRAM)。在计算机科学中,多重缓冲是一种使用多个缓冲区来存储数据块的技术,目的是使“读取者”看到的。尽管可能是旧的)数据版本,而不是正在被“写入者”更新中的。
2025-03-08 23:43:32
193
原创 vector的emplace_back和push_back
2. 在a不存在的情况下,使用emplace_back最佳,push_back 的move次之,push_back的最差。“在已经存在对象的情况下,push_back 和 emplace_back其实都只有一次调用构造,不过构造函数不同。1. 在a已经存在的情况下,使用push_back的move最佳,其他emplace和push都差不多。对于拷贝构造和move构造, 拷贝可能涉及到深浅拷贝,move直接搞指针,所以快。push_back(std::move(a)):调用一次移动构造。
2025-02-28 15:32:28
201
原创 C++中的模板的一些约定熟成(不看后悔一辈子)
Predicate:强调条件判断,返回 bool,用于筛选或测试。Compare:强调顺序比较,返回 bool,用于排序或优先级。Operation:强调计算或变换,返回任意类型,用于处理数据。Function:最通用,表示任何可调用对象,不限类型或用途。命名惯例典型含义示例场景Predicate返回布尔值的条件检查Compare定义顺序的二元比较Operation执行变换或计算Function通用可调用对象Iterator迭代器类型T通用类型参数。
2025-02-28 01:12:11
948
原创 Linux的Pthreads mutex采用futex(2)实现
(Fast Userspace Mutex)是一种 Linux。,但具体的实现取决于 glibc 版本和互斥锁的类型。如果你有更具体的问题,可以继续问我!如果线程持锁时间较短(比如自旋锁。中有不同类型,影响是否使用。,Linux 还使用。
2025-02-10 23:21:23
559
原创 GCC 头文件的搜索顺序
目录作用来源系统级头文件系统软件包GCC 运行时库和内部文件GCC本地安装的软件头文件手动安装的软件手动指定的-I路径(如这样可以保证本地安装的库优先于系统库,但不会影响 GCC 自己的库。当您使用它gcc xxx.c来编译程序时,GCC会自动为您包含一些默认的-I(包含路径)和(库路径)-L1. GCC 默认的-I路径当你不手动指定-IGCC默认会搜索GCC 自己的头文件,比如stdarg.h手动安装的软件的头文件目标架构相关的系统头文件标准库头文件,比如stdio.h。
2025-02-01 23:48:06
545
原创 I/O multiplexing LT and ET
可惜的是,目前内核中使用同一种数据结构表示读和写事件,读写事件放在一个就绪列表中,在读出后才判断是读事件还是写事件。因此,我们无法实现在不同的场景使用不同的模式。值得注意的是,许多第三方网络库都使用的是LT模式,一般来说为了互相的兼容推荐使用LT模式。如果有事件到达,还没有进行处理,则它会一直通知,直到事件被处理。LT模式 更适用于read()事件,它不会造成接收的饥饿,ET模式可能会造成数据接收不完整的情况。,即使你没有处理这个事件,它也会持续触发。,否则可能会丢失连接。
2025-01-31 15:46:08
579
原创 c# getUppercase
需要注意的是,GetUpperBound 方法返回的是最大索引值,而不是数组的长度。在这个示例中,`array` 是一个 3x3 的二维数组,`maxIndex0` 和 `maxIndex1` 分别是第一维和第二维中最大元素的索引。在这个例子中,`array` 是一个 3 行 4 列的二维数组,`maxRowIndex` 的值为 2,因为行的索引范围是 0 到 2。在这个例子中,`array` 是一个 3 行 4 列的二维数组,`minRowIndex` 的值为 0,因为行的索引范围是 0 到 2。
2023-03-31 18:02:30
250
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人