- 博客(23)
- 收藏
- 关注
原创 RapidJSON 自定义内存分配器详解与实战
RapidJSON作为高性能C++ JSON库,支持通过Allocator模板参数自定义内存管理策略。分析源码发现,GenericValue默认使用CrtAllocator(基于malloc/free),但可通过实现类似MyAllocator的类进行替换。自定义分配器可应用于:1)使用mmap等机制优化内存效率;2)通过统计分配信息实现性能分析。这种"零成本抽象"设计使RapidJSON能适应高性能、嵌入式等多样场景,同时保持核心解析性能。开发者可根据需求灵活选择系统默认分配或定制方案。
2025-09-23 10:58:43
536
原创 QT基于mmap文件映射机制实现的内存池方法总结
mmap(Memory-Mapped File I/O)是一种在Unix-like操作系统(包括Linux和macOS)以及Windows中用于将文件或设备映射到进程的地址空间的技术。它允许程序直接对内存进行读写操作,而不是通过传统的I/O系统调用如read和write来访问文件内容。这种方式可以简化编程模型,同时提供更高效的I/O性能。通过基于mmap文件映射机制的内存池实现,我们显著优化了内存分配效率并减少了碎片化问题,提升了应用程序的性能和稳定性,解决了大数据量占用内存量高的问题。
2025-02-11 14:29:07
1139
原创 C++高级内存管理:delete的高阶使用方法与注意事项
有时需要使用自定义的删除逻辑。可以通过函数包装器(如 std::unique_ptr 和 std::shared_ptr)来实现。~Widget() { /* 自定义析构 */ }delete ptr;delete ptr;问题:为什么unique_ptr要指定删除函数的类型,而shared_ptr不用?std::shared_ptr 内部管理删除器的方式是通过类型擦除(type erasure)来实现的。
2025-02-11 09:45:49
685
原创 C++高级内存管理:new的高阶使用方法与注意事项
通过本文的介绍,我们了解了 new 运算符不仅限于简单的内存分配和对象初始化,它还支持带参数的对象构造、数组分配、定位 new 以及自定义内存管理等多种高级用法。合理利用这些功能,不仅可以提高代码的灵活性和效率,还能增强程序的稳定性和可维护性。希望本文能为你的C++开发之旅提供有价值的参考。
2025-02-08 08:44:20
430
原创 C++最小众语法,99.99%的人都不知道
根据解释大概意思为有些字符集不兼容ISO646标准的符号,为了处理这种情况C++语言提供了Alternative tokens作为相同含义的token,替换原token后不影响代码语义。意思是说某些符号可以被右边的符号替代,抱着试试的心理,随便写了一下。此文章仅供娱乐,千万别在工作中使用,被同事说叼毛就别怪我了。随便问问AI回答,连AI都不清楚这个东西,看来真的很小众。某天在cppreference网站上看到这样一个地方。
2025-02-06 14:28:23
228
原创 C++单例模式跨DLL调用问题梳理
假设有这样一个单例模式的代码接下来分别调用它们运行后得到结果居然得到了不一样的地址,说明这种方法实现单例会发生意料之外的问题。
2025-01-06 13:57:51
806
原创 C++行为性能消耗总结
个人其实只需要了解下虚函数、线程切换、异常、原子变量、socket、IO、分支预测等性能消耗,其余行为在当下水平也没办法感知到。从网上看到一张性能消耗图,记录一下。
2024-10-31 13:51:08
300
原创 QScopeGuard使用方法详解
总体来看,QScopeGuard的使用难度并不高,仅仅是辅助我们代码编写,降低代码的易错性(这里不绝对,某些场景会适得其反),合理使用会大大增强代码可读性和稳定性。!!
2024-10-14 14:55:25
759
原创 计算机操作系统-局部性原理理解
作为一个优秀的程序员,一定要理解局部性原理,学会重复使用已用过的数据,或者使用已用过数据的邻近数据,也就是说,程序常常会使用集中在一起的局部数据。
2024-05-08 16:32:07
748
3
原创 关于C++构造shared_ptr推荐使用make_shared原因分析
并且使用make_shared可以减少一次堆内存的申请操作,make_shared会一次性申请一整块内存,一块内存给引用计数块使用,一块内存给源结构体使用,理论上就会有性能上的提升。shared_ptr内部有两个要点:一个是引用计数块,一个是传递进来的源结构体指针,引用计数块会管理这个源指针,引用计数为0时,会自动释放对应的内存。此时A的内存与智能指针的内存就是连续的了。
2024-05-08 16:29:34
258
1
原创 C++ 深入理解This指针及原理
在使用std::bind绑定对象函数时,都需要将this作为第一个参数传递给bind函数,经过一番资料查阅后终于知道原因。结论:在函数中执行时,就算对象中途被销毁也不会影响this的使用,此时this指向的地址仍然是该对象析构前的地址。当线程进入函数后,this将作为一个局部变量传入函数中,且指向该对象。
2024-04-30 09:46:25
298
1
原创 从源码角度理解QT信号和槽-信号连接类型
从源码角度理解QT信号和槽-参数传递。其中列举了Qt信号连接的几种类型,但是没有深入解析每一种连接的原理,因此还想补一篇文章继续通过Qt源码分析Qt信号连接类型内部机制。经过以上解析我们得出几个总结:1.自动连接实际是根据线程判断连接类型是直接连接还是队列连接2.直接连接实际上类似于观察者模式,能够立即触发槽函数3.队列连接是利用Qt事件循环机制来实现的,并且参数会发送拷贝构造出新的出来4.阻塞连接千万不能在同一线程中使用。
2024-02-28 15:47:14
1979
1
原创 基于Windows API下的ICMP协议通信C++实现
最近正在开发一个网络质量检测工具,可实时检测网络质量并报告,开始的想法即是循环ping目标服务器,然后计算延迟及丢包率得出结果。因此需要基于C++实现ICMP的网络通信。
2024-02-25 16:18:14
648
原创 QNetworkAccessManager实现的HTTP异步接口调用问题解决
但是这种方法有一种情况会使程序出现异常:当MainWindow调用请求后又进行析构,之后网络请求数据到达后通过callBack进入lambda函数中,假如该函数有使用MainWindow中的成员变量就会发送异常,这种情况在网络状态不好的时候经常发生。利用QT中的QPointer特性,构造一个指向MainWindow的QPointer,将QPointer捕捉到lambda函数中,之后判断一下MainWindow是否为空。
2024-02-24 09:30:28
768
原创 从源码角度理解QT特性-对象树
众所周知,在C11之前,C++的内存管理是非常让人头疼的,从C11之后新增了智能指针加强在开发过程中对内存泄漏的防范,而QT中又有一个独有的特性-对象树。对于QObject来说,每个对象都可以存在多重的子父关系,因此这种关系整体来看就形成了对象树。从内存管理的角度分析,它有一个很重要的作用:当父对象析构后,挂载到其下的所有子对象将会被附带析构。基于这一特性,很大的预防了内存泄漏带来的风险。
2024-02-23 09:39:17
1534
原创 QNetworkAccessManager实现超时机制的同步Http网络接口
在之前写过一篇基于QNetworkAccessManager实现的异步HTTP网络接口,于是想补一篇同步的HTTP网络接口实现方法。QNetworkAccessManager实现可手动中断和超时机制的异步Http网络接口同步就需要在抛出请求后阻塞代码,直至请求数据返回后再返回当前函数。在QT开发中,假如在主线程中调用就绝对不能卡UI界面,因此需要在等待http请求返回期间正常进行事件循环。
2024-02-22 18:40:30
789
1
原创 QNetworkAccessManager实现可手动中断和超时机制的异步Http网络接口
Qt中的网络访问 API 是围绕 QNetworkAccessManager 对象构建的,该对象保存它发送的请求的通用配置和设置。因此实现Http请求必然需要使用QNetworkAccessManager 来开发。需要注意的是:QNetworkAccessManager 是基于 QObject 的,所以只能在它所属的线程中使用。
2024-02-21 09:23:17
1253
1
原创 从源码角度理解QT信号和槽-参数传递
Qt中的信号和槽机制想必是Qt开发者再熟悉不过的机制了,但是在某个上班摸鱼的日子我做了一个示例,才发现其中还是有很多的坑,接下来主要通过源码的简单解析记录一下参数传递相关特性供参考。
2024-02-20 10:03:34
1689
原创 QT表格函数表达式计算工具
在公司产品中又新增了一个需求:需要在低代码工具平台中配置类似excel的函数表达式计算,如sum(单价*库存数量),其中“单价”和“库存数量”为该表格表头的标题,表示计算每一行的总金额然后对其求总和,之后显示到界面上显示。
2024-02-16 16:19:50
855
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅