# cppMisc
**Repository Path**: galaxy_0/cpp-misc
## Basic Information
- **Project Name**: cppMisc
- **Description**: 工程级的设计模式模板库(design pattern),算法(algorithm),数据结构(data structure)以及一些通讯等常用库的实现和封装。主要包含了一般通讯,LOG,设计模式,数据容器等内容。设计模式模板类是其中的重点实现模块
- **Primary Language**: C++
- **License**: GPL-3.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 53
- **Forks**: 14
- **Created**: 2023-04-17
- **Last Updated**: 2026-10-16
## Categories & Tags
**Categories**: Uncategorized
**Tags**: Cpp, 设计模式
## README
# C++ 通用工具库知识库 (cppMisc Knowledge Base)
## 🎯 知识库入口
> 📚 本项目已整理为系统化知识库,方便在所有 C++ 开发中优先使用!
### 📖 必读文档
| 文档 | 说明 | 适合人群 |
|------|------|---------|
| **[KB_INDEX.md](KB_INDEX.md)** | 知识库索引 | 所有开发者 |
| **[QUICK_REFERENCE.md](QUICK_REFERENCE.md)** | 快速参考卡 | 日常开发 |
| **[BEST_PRACTICES.md](BEST_PRACTICES.md)** | 最佳实践指南 | 进阶提升 |
### 🚀 快速导航
**设计模式**(23种)
- 单例、工厂、观察者、命令、策略、状态、装饰器...
- 📁 `include/designM/`
**高性能容器**
- AVL、红黑树、B+树、跳表、堆、变体类型...
- 📁 `include/container/`
**内存管理**
- 对象池(760万+ ops/sec)、内存池、环形缓冲区...
- 📁 `include/objPool/`、`include/memPool/`
**并发编程**
- 线程池、无锁队列、互斥锁...
- 📁 `include/threadPool.hpp`
**网络通信**
- TCP/UDP 服务器与客户端、SSL、HTTP、WebSocket...
- 📁 `include/details/`、`include/mandarava/`
**配置解析**
- XML / YAML / JSON 三种格式统一接口(`itfcConfile`),按扩展名用 `createConfile(path)` 选择后端,与旧 `CConfFile` 用法兼容
- 支持四种标量类型(string/int/bool/float)与**同构数组**(`AddArray`/`GetArray`/`SetArray`/`ArrayAppend`/`ArrayRemove`),路径末段可用 `name[idx]` 索引语法直接读写元素
- 📁 `include/itfcConfile.hpp`、`include/xmlConfile.hpp`、`include/yamlConfile.hpp`、`include/jsonConfile.hpp`
- 📖 使用说明:[doc/confile_usage.md](doc/confile_usage.md)
### 💡 学习路径建议
**初级** → 单例模式 → 线程池 → INI解析器 → 环形缓冲区
**中级** → 对象池 → 工厂模式 → 观察者模式 → AVL/红黑树
**高级** → B+树 → 工作水系模式 → 享元模式 → 解释器模式
---
## 📦 项目简介
cppMisc 是一个经过实战检验的 C++ 通用工具库,包含:
- ✅ **23 种设计模式** - 纯头文件实现,开箱即用
- ✅ **高性能容器** - AVL、B+树、跳表等数据结构
- ✅ **内存管理** - 对象池(760万+ ops/sec)、内存池
- ✅ **网络通信** - TCP/UDP/SSL 跨平台实现
- ✅ **并发编程** - 线程池、无锁队列等
- ✅ **实用工具** - 配置文件解析、日志系统、加密算法等
#### 与本资源中设计模式实现部分的designM目录下配套的书已经出版
#### 书出版后已经被40余家高校、社会图书馆馆藏。其中包括清华大学、浙江大学、西安电子科技大学等顶尖院校

https://www.las.ac.cn/front/book/detail?id=f76459d8276839586319b1443649d568

# cppMisc
#### changelog
- 2026-10-16 配置文件模块增加数组机制:`itfcConfile` 新增同构标量数组(`AddArray`/`GetArray`/`SetArray`/`ArrayAppend`/`ArrayRemove`/`GetArraySize`/`GetArrayElemType`),并在路径末段支持 `name[idx]` 索引语法(`GetValue`/`SetValue`/`has`/`Del` 直接访问单个元素)。XML 用 `v` 存储,YAML/JSON 沿用原生数组;`type_of` 新增 `emDataType::ARRAY`。测试扩至 400 项断言,全部通过。
- 2026-10-15 配置文件模块接口化重构:把原先与 XML 实现耦合的 `cconffile` 拆成抽象接口 `itfcConfile` + 三个后端实现(`xmlConfile`/tinyxml2、`yamlConfile`/yaml-cpp、`jsonConfile`/nlohmann-json,依赖以源码 vendor 在 `third_party/`)。对外接口与旧 `CConfFile` 保持一致(保留 `using CConfFile = xmlConfile` 别名,并新增 `createConfile(path)` 工厂按扩展名选择后端)。原 XML 实现从旧代码剥离,底层 XML 库换用 tinyxml2;同时修复旧实现缺陷:`Save(file)` 的 `delete this`、`AddValue(bool/float/double)` 写错 `type` 标签、`Del()` 未判空、`GetValue` 被空格截断、浮点序列化精度丢失。新增 `test/confile` 单元与冒烟测试(三个后端共用一套断言),231 项断言全部通过。
- 2026-08-23 增加windows版本的共享内存。
- 单元测试覆盖(13 项全部通过):
semaphore: 基本加解锁 / tryLock 抢占 / 跨线程同步
smfLockGuard: RAII 自动解锁
sharedMem: 创建/初始化 / 客户端打开 / hasNewData / 容量截断 / 100 次循环
eventFD: 单次 emit 接收 / 5 次连续 emit / 客户端重连
端到端: sharedMem + eventFD 组合使用
- 性能测试结果(Release 构建,本机实测):
| 场景 | 结果 |
|--|--|
|单进程 send/recv (64B) |0.48 us/op, 253 MB/s|
单进程 send/recv (64KB) |2.64 us/op, 47.4 GB/s|
|双对象 send/recv (64KB) |2.69 us/op, 46.5 GB/s|
|eventFD 单向通知延迟 |2.90 us/notify|
|端到端往返延迟(send+emit+recv) |6.04 us/round-trip|
- 2026-03-12 修复了facade.hpp 中的几个错误,加固了只能指针的管理
- 2025-12-19 修复strategy.hpp connect模板函数的一个错误
- 2025-11-05 新增了对象池模块objPool,采用纯头文件的方式实现,每秒约760万的吞吐能力。支持任意对象类型。性能测试结果如下:
```
================================================================================
测试时间: 2025-11-05 20:42:12
C++标准: C++17
平台信息: Linux
CPU核心数: 36 核心
================================================================================
=== 性能测试 ===
测试场景: 池大小=100, 操作次数=100000
对象池性能:
- 成功获取: 50050 次
- 失败获取: 49950 次
- 总耗时: 14.997 ms
- 平均每次操作: 0.150 微秒
- 吞吐量: 6668000 ops/sec
new/delete性能对比:
- 总耗时: 24 ms
- 平均每次操作: 0.244 微秒
- 吞吐量: 4102732 ops/sec
- 对象池加速比: 1.63x
测试场景: 池大小=100, 操作次数=500000
对象池性能:
- 成功获取: 250050 次
- 失败获取: 249950 次
- 总耗时: 75.19 ms
- 平均每次操作: 0.150 微秒
- 吞吐量: 6649732 ops/sec
new/delete性能对比:
- 总耗时: 125 ms
- 平均每次操作: 0.251 微秒
- 吞吐量: 3986383 ops/sec
- 对象池加速比: 1.67x
测试场景: 池大小=100, 操作次数=1000000
对象池性能:
- 成功获取: 500050 次
- 失败获取: 499950 次
- 总耗时: 152.02 ms
- 平均每次操作: 0.152 微秒
- 吞吐量: 6578168 ops/sec
new/delete性能对比:
- 总耗时: 247 ms
- 平均每次操作: 0.247 微秒
- 吞吐量: 4050518 ops/sec
- 对象池加速比: 1.62x
测试场景: 池大小=1000, 操作次数=100000
对象池性能:
- 成功获取: 50500 次
- 失败获取: 49500 次
- 总耗时: 15.23 ms
- 平均每次操作: 0.152 微秒
- 吞吐量: 6565126 ops/sec
new/delete性能对比:
- 总耗时: 40 ms
- 平均每次操作: 0.400 微秒
- 吞吐量: 2502064 ops/sec
- 对象池加速比: 2.62x
测试场景: 池大小=1000, 操作次数=500000
对象池性能:
- 成功获取: 250500 次
- 失败获取: 249500 次
- 总耗时: 74.64 ms
- 平均每次操作: 0.149 微秒
- 吞吐量: 6699180 ops/sec
new/delete性能对比:
- 总耗时: 197 ms
- 平均每次操作: 0.395 微秒
- 吞吐量: 2532492 ops/sec
- 对象池加速比: 2.65x
测试场景: 池大小=1000, 操作次数=1000000
对象池性能:
- 成功获取: 500500 次
- 失败获取: 499500 次
- 总耗时: 150.82 ms
- 平均每次操作: 0.151 微秒
- 吞吐量: 6630376 ops/sec
new/delete性能对比:
- 总耗时: 410 ms
- 平均每次操作: 0.410 微秒
- 吞吐量: 2439542 ops/sec
- 对象池加速比: 2.72x
测试场景: 池大小=10000, 操作次数=100000
对象池性能:
- 成功获取: 55000 次
- 失败获取: 45000 次
- 总耗时: 16.22 ms
- 平均每次操作: 0.162 微秒
- 吞吐量: 6165608 ops/sec
new/delete性能对比:
- 总耗时: 312 ms
- 平均每次操作: 3.122 微秒
- 吞吐量: 320329 ops/sec
- 对象池加速比: 19.25x
测试场景: 池大小=10000, 操作次数=500000
对象池性能:
- 成功获取: 255000 次
- 失败获取: 245000 次
- 总耗时: 77.00 ms
- 平均每次操作: 0.154 微秒
- 吞吐量: 6493591 ops/sec
new/delete性能对比:
- 总耗时: 1697 ms
- 平均每次操作: 3.394 微秒
- 吞吐量: 294651 ops/sec
- 对象池加速比: 22.04x
测试场景: 池大小=10000, 操作次数=1000000
对象池性能:
- 成功获取: 505000 次
- 失败获取: 495000 次
- 总耗时: 152.46 ms
- 平均每次操作: 0.152 微秒
- 吞吐量: 6559097 ops/sec
new/delete性能对比:
- 总耗时: 3414 ms
- 平均每次操作: 3.414 微秒
- 吞吐量: 292929 ops/sec
- 对象池加速比: 22.39x
长时间运行稳定性测试 (100,000,000次操作):
进度: 10%, 已运行: 1秒
进度: 20%, 已运行: 3秒
进度: 30%, 已运行: 4秒
进度: 40%, 已运行: 6秒
进度: 50%, 已运行: 7秒
进度: 60%, 已运行: 9秒
进度: 70%, 已运行: 10秒
进度: 80%, 已运行: 12秒
进度: 90%, 已运行: 13秒
稳定性测试完成:
- 总操作次数: 100000000
- 总耗时: 15 秒
- 平均吞吐量: 6666667 ops/sec
```
- 2025-11-04 修改了xml配置文件模块cconffile.xml,将GetValue重载方法改成了模板方法,能够支持更多的类型;
- 2025-11-04 新增线程安全的内存池模块memPool,支持任意数据类型的内存池化。实际测试性能不佳,请谨慎使用
- 2025-09-03 增加tinySeqFile模块,这是一个以顺序保存的文件引擎。采用分页定数量保存的方式,内部使用unordered_map作为页索引。适合用于嵌入式顺序数据持久化;或者其他情况下的日志文件保存等场景
-- 1. 核心功能性能
单次操作延迟: < 1ms (基于测试观察)
初始化时间: 几乎瞬时 (文件已存在时)
内存占用: 固定且可预测 (约 10000*24 ≈ 240KB)
-- 2. 吞吐量性能
单线程顺序写入: 约 10,000 次操作/秒
多线程并发: 4线程并发下约 30,000 次操作/秒 (基于 HighConcurrency 测试)
大数据量处理: 10,000 条记录处理时间 < 2秒
- 2025-09-02 增加rapidjson类型系统模板,方便读取JSON的数据
- 2025-09-01 加固了命令模式,避免条件变量误触发
- 2025-08-12 修改了单例模式,增加了meyer's方式
- 2025-????-?? sharedMem v1.1:新增 Windows 平台实现(CreateFileMapping / 命名事件 / 命名信号量),公开 API 与 Linux 完全一致;新增 13 项单元测试 + 4 组性能基准(64KB 吞吐 ~46 GB/s,eventFD 通知 2.9 µs);技术文档 `doc/sharedMem.md` 与博客 `doc/sharedMem_blog.md` 同步更新至 v1.1
- 2025-04-30 修改了状态模式模块的类型定义部分,增强了类型检查能力
- 2025-04-30 验证完成了sharedMem模块
- 2025-04-21 新增了linux共享内存封装sharedMem,暂时没有经过验证,小心使用
- 2024-12-13 单例模式(designM/singleton.hpp)增加了多线程支持, 提高了在多线程情况下的安全性
- 2024-07-04 线程池增加排队队列长度限制,超出则会抛出std::runtime_error. 默认队列长度为10000,可以用包含队列长度的构造函数指定最大长度
- 2024-05-07 新增debug模块,输出调用栈信息,目前仅仅调试了在linux下的模块。使用非常简单,比如
```
#include "debug.hpp"
void func()
{
wheels::debug::printCallstack();
}
```
- 2024-04-02 在计时器模块中新增一个orderedTimer类,提供了排序的软计时器功能,程序中可以仅仅一个系统计时器,通过软计时器完成多计时器的功能。
- 2024-03-28 解释器模式,增加执行函数接口
- 2023-11-23 新增ssl服务器
- 2023-11-20 新增了访问者模式
- 2023-11-6 新增状态模式
- 2023-11-3 新增了中介者模式
- 2023-11-2 新增了备忘录模式,组合模式和代理模式
- 2023-7-15 新增了INI文𢓐处理模块
- 2023-7-14 新增了适配器模式 include/designM/adaptor.hpp
- 2023-7-7 新增了外观模式,include/designM/facade.hpp"分别以接口和继承的两种方式实现 , 示例在example目录下
- 2023-7-4 新增了建造者模式,include/designM/build.hpp , 示例在example目录下
- 2023-6-30 新增了抽象工厂模式 include/designM/absFactory.hpp,示例在example目录下
- 2023-6-26 新增了线程池 include/threadPool.hpp
- 2023-5-28 新增红黑树
- 2023-5-7 新增variant,任意数据类型, 文件路径container/variant.hpp。这个模块是一个纯头文件的模板类,支持在其他的stl容器中使用这个模块
- 2023-5-9 新增variant简单介绍文档
#### 介绍
我自己常用的基础算法,接口的封装。主要包含了常用的设计模式,容器和一些常用的功能性接口。
- 设计模式采用元编程的方式实现。目前已经实现了22种设计模式。主要包含了单例模式,装饰模式,策略模式,工厂模式和桥接模式等。项目位于include/designM目录。设计模式实现都是采用纯头文件的方式可以直接引用
- 容器目前实现了AVL, variant , 红黑树rbTree。这部分代码位于include/container目录中
- cefQT是一个可以在QT程序中嵌入浏览器的模块,这个模块依赖于libcef,使用的时候需要先安装libcef
#### 安装教程
- 单例模式使用说明:
业务实现类应该继承于singleton,并在实现文件中使用宏 IMP_SINGLETON
在头文件中:
```
#include "designM/singleton.hpp"
class newSingleClass : public wheels::dm::singleton< newSingleClass > {
// 您自己的实现代码
};
```
在实现文件中:
```
IMP_SINGLETON(newSingleClass);
// 您自己的实现代码
```
应用时:
创建对象,create支持可变参数方式,因此可以应用于有不同参数的构造函数
```
newSingleClass * p = newSingleClass::create();
newSingleClass * p = newSingleClass::create( 12 , "abc" );
```
获取对象:
```auto * p = newSingleClass::get();```
- 工厂模式:工厂模式采用两种方式实现,一种是采用类继承的方式;一种是采用模板函数的方式
1. 采用模板函数的方式适用于公有的构造函数的类,例如:
```
class a{
public:
a();
a( int c );
};
a * pa = factory< a >( 23 );
a * pa2 = Factory< a >( []( Factory::emErrCode err){
// 错误处理
} , 23 );
```
这里注意,工厂函数考虑了创建没有考虑销毁,在使用完成对象后要自己调用delete完成对象的销毁
2. 采用类继承的方式适用于采用私有构造函数的方式,例如
```
class a : public Factory< a >{
public:
a();
a( int c );
};
a * pa = a::factory( 23 );
```
- 责任链模式
使用示例:
```
class myItfc{
virtual int do_something( int ) = 0;
定义接口
};
class myItfc1 : public myItfc{
接口实现1
};
class myItfc1 : public myItfc{
接口实现2
};
class myRsps : public rspsLink< myItfc >{
自己的定义和方法
}
myRsps rsps;
rsps.push_back( new myItfc1 );
rsps.push_back( new myItfc2 );
rsps.push_back( ... );
/// 按照责任链传递操作
int a = 1;
rsps.forward([&]( myRsps::stLinkItem& item ){
a = item->do_something( a );
});
```