- 博客(316)
- 资源 (8)
- 收藏
- 关注
原创 Qt .pro文件配置详解(全)
在 Qt 项目里,.pro文件是项目文件,其作用是对项目的构建进行配置。实现对Qt工程的全生命周期控制,从编译优化到部署策略均可精准把控,是构建企业级Qt应用的必备核心技能。建议结合Qt Creator的.pro解析器源码深入研究,可达到"人剑合一"的工程配置境界。
2025-05-02 15:16:33
822
4
原创 for(auto it: vec)和for(auto& it: vec)的区别以及使用场景
for(auto it: vec)适用于只需要读取容器元素值的场景,会复制元素的值,可能存在性能开销。for(auto& it: vec) 适用于需要修改容器元素值的场景,通过引用直接操作容器元素,避免了复制开销。此外,若你不希望修改元素,同时又想避免复制大对象带来的开销,可以使用或或这样it是元素的常量引用,既能避免复制,又能防止意外修改元素。
2025-04-28 23:06:50
492
7
原创 面试题:循环引用两个节点相互引用,如何判断哪个用 shared_ptr?哪个用 weak_ptr?
核心准则:通过分析对象生命周期控制权,确定shared_ptr和weak_ptr的使用。始终确保至少有一条所有权路径不形成闭环。谁管理生命周期,谁用 shared_ptr。谁仅需引用对方,谁用 weak_ptr。
2025-04-20 21:06:34
514
5
转载 腾讯二面追问epoll,它凭啥性能一骑绝尘?
epoll性能高,主要得益于其独特设计。在事件驱动方面,摒弃传统 select 和 poll 的轮询方式,仅在文件描述符有实际事件发生时,才由内核通知应用程序,极大减少无效检查,像在拥有大量并发连接的场景中,能精准定位到活跃连接,避免对众多无事件连接的遍历。在数据结构运用上,采用红黑树管理注册的文件描述符,其插入、删除和查找的时间复杂度为 O (log N),远优于传统线性结构;同时利用就绪链表,当文件描述符就绪时,内核将其从红黑树移至链表,epoll_wait 只需遍历该链表,就能获取就绪事件,提升了事件
2025-04-18 22:12:20
61
1
原创 面试题:C++11在C++98基础上增加了哪些内容?
最近也在面试,问C++11里面的某个具体内容倒不多,反而问 " C++11和C++98有哪些不同?" 的比较多。其实C++11从2011年发展到现在已经很多年了,普及率还是不高,以至于很多C++11的特性,开发者都不知道。今天这里就抛砖引玉,缩略的总结一下C++11增加的大部分内容。 C++11 在语法、内存管理、并发编程、模板特性以及标准库等方面都有重大改进,使 C++ 语言更加现代化、高效和易用。
2025-04-16 16:29:57
1072
5
原创 C++中unique_lock和lock_guard区别
std::unique_lock 和 std::lock_guard 都属于标准库 <mutex> 中的互斥锁管理工具,用于简化互斥锁的使用并确保线程安全。但它们存在一些显著区别,std::lock_guard 适用于简单的锁定场景,追求简洁性和较低的性能开销;而 std::unique_lock 则适用于需要更复杂锁定逻辑、支持所有权转移的场景,但会带来一定的性能开销。
2025-04-15 19:42:58
866
6
原创 面试题:请描述一下你在项目中是如何进行性能优化的?针对哪些方面进行了优化,采取了哪些具体的措施?
在实际项目中,性能优化是一个持续的过程,它贯穿于软件开发的各个阶段,需要综合考虑各个方面的因素,并根据具体的业务场景和性能瓶颈进行有针对性的优化。同时,要通过性能测试工具不断地对优化效果进行评估和验证,确保优化措施达到了预期的效果。
2025-04-15 09:32:41
925
3
原创 HTTP 响应状态码(Status Code)
HTTP(超文本传输协议)状态码是由服务器返回给客户端的三位数字代码,用于表示请求处理的结果。这些状态码可以分为五大类
2025-04-14 20:55:02
754
原创 C++模板编程之类型萃取
C++ 模板编程中的萃取(Traits)特性是一种强大的技术,它允许在编译时获取类型的相关信息,并根据这些信息来调整程序的行为。萃取特性本质上是一种类型信息的查询机制,通过模板元编程实现,在标准库和许多开源库中被广泛应用。萃取是一种通过模板来封装类型相关信息的技术,这些信息可以是类型的属性、行为或者其他特征。通过萃取,我们可以在编译时根据不同的类型执行不同的操作,实现代码的复用和泛化。实现原理萃取通常基于模板特化来实现。模板特化允许我们为特定的类型或一组类型提供专门的实现。
2025-04-09 14:41:30
1044
5
原创 C++11之std::is_convertible
是 C++ 标准库头文件中的一个类型特性(type trait),它用于在编译时检查一个类型是否可以隐式转换为另一个类型。From是源类型。To是目标类型。是一个模板结构体,若From类型的对象可以隐式转换为To类型,为true,否则为false。是一个常量表达式,是的缩写形式。例如,一般的从int转换成float或从float转换成int,都是可以的。// 检查 int 是否可以转换为 double// 检查 double 是否可以转换为 int。
2025-04-05 17:35:51
766
4
原创 QT 中的元对象系统(五):QMetaObject::invokeMethod的使用和实现原理
的核心原理基于 Qt 的元对象系统。元对象系统是 Qt 实现信号槽机制、属性系统和动态调用的基础。每个继承自QObject且包含Q_OBJECT宏的类都有一个与之关联的对象,该对象存储了类的元数据,如类名、信号、槽、属性等信息。函数利用这些元数据,通过方法的名称或索引来查找并调用对象的方法。它可以在不同线程之间安全地调用方法,并且支持同步和异步调用。调用流程当调用1)查找元对象信息首先,函数会获取调用对象的对象。通过QObject的方法可以获取该对象的元数据。然后,根据传入的方法名称或索引,在。
2025-04-03 22:23:12
1220
7
转载 QT 中的元对象系统(四):信号槽机制深入理解
信号槽(Signals and Slots)是 Qt 框架中用于对象间通信的核心机制,它为开发者提供了一种灵活、类型安全且高效的方式来实现对象间的交互。clicked()信号槽是观察者模式的一种实现,特性如下:A、一个信号就是一个能够被观察的事件,或者至少是事件已经发生的一种通知;B、一个槽就是一个观察者,通常就是在被观察的对象发生改变的时候——也可以说是信号发出的时候——被调用的函数;C、信号与槽的连接,形成一种观察者-被观察者的关系;D、当事件或者状态发生改变的时候,信号就会被发出;
2025-04-03 11:02:37
141
2
原创 WebSocket原理详解(二)
如果端点(客户端或服务器)收到了一个关闭帧,并且之前没有发送过关闭帧,则端点必须发送一个关闭帧作为响应。一个端点可以延迟发送响应直到它的当前消息发送完毕(例如,已经发送了大多数的消息片段,则端点可能会在发送关闭响应帧前先将剩下的消息帧发送出去)。当WebSocket接收方接收到一个数据帧时会根据FIN(数据帧中的一个标识,用来判断当前帧是否当前消息的最后一帧)的值来判断是否已经接收到消息的最后一个数据帧。,该部分表明了关闭的原因,例如:端点关闭、端点接收帧过大或端点收到的帧不符合预期。
2025-04-01 22:17:39
941
4
原创 设计模式之适配器模式(二):STL适配器
在计算机科学中,适配器 (Adapter)是一种设计模式,它允许将一个现有类的接口转换成另一种接口,以满足客户的期望。适配器模式通过封装一个对象,并提供一个新的接口来访问该对象的功能。适配器模式的核心思想是 "包装"。适配器类包含一个现有类的实例,并在其内部实现新的接口。当用户通过适配器的新接口调用方法时,适配器会将这些调用转换为对现有类实例的相应方法的调用。它定义了用户期望使用的接口,使得用户可以以一种统一的方式访问适配器的功能。
2025-03-30 09:05:35
922
6
原创 Qt之共享内存类QSharedMemory的使用及实现原理(全)
跨平台支持:对不同操作系统(如 Windows、Linux 等)的底层共享内存机制进行封装,屏蔽了各系统间的差异,为开发者提供统一的接口,方便在不同平台上实现进程间共享内存通信。简化操作:提供了创建、附加、分离、删除共享内存等操作的简单方法,降低了使用共享内存的复杂度,开发者无需深入了解底层系统调用细节。数据共享:允许不同进程或线程访问同一块物理内存区域,实现高效的数据共享,避免了数据在不同进程间的多次拷贝,提高了数据传输效率。从使用的角度来讲,尤其是在线程或进程间数据通信来讲还是非常方便的;
2025-03-28 16:08:25
1158
原创 双指针技巧在C++中的应用:从基础到进阶
在算法题中,双指针具有很多应用,那么在实际项目中,你有使用过双指针技巧吗?主要是什么场景?欢迎评论区交流讨论~推荐阅读滑动窗口算法详解:概念、应用与实例,-CSDN博客C++合并两个有序数组-CSDN博客。
2025-03-25 22:56:32
994
2
原创 C++合并两个有序数组
给两个按排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请 合并 nums2 到 nums1 中,使合并后的数组同样按排列。注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n。分析:所谓可以理解为。
2025-03-23 22:14:14
343
4
原创 C++17之std::not_fn的使用和实现原理
std::not_fn接受一个可调用对象(如函数指针、函数对象或 lambda 表达式),并返回一个新的可调用对象。当调用这个新的可调用对象时,它会调用原始的可调用对象,并对其返回值进行逻辑取反操作。
2025-03-23 12:33:33
571
1
原创 Qt开发中的常见问题与解决方案
在网络应用程序中,保持TCP连接的稳定性非常重要。为了确保连接不会因为断电或非法关闭程序而中断,开发者可以自定义心跳包或启用系统层的保活机制。// 开启keepalive属性// 5秒内无数据交互则进行探测// 探测时间间隔为2秒// 探测重试次数通过设置这些参数,可以确保TCP连接在异常情况下能够及时断开,避免长时间的无响应。Qt提供了类来处理数据库查询结果。开发者可以通过继承来实现自定义的查询模型,例如修改某一列的字体颜色或样式。通过重写data。
2025-03-19 23:38:51
720
4
原创 QVariant:Qt中万能类型的使用与理解
对于自定义类型,需要将其注册到 Qt 的元对象系统中,以便QVariant能够处理。定义自定义类型// 定义自定义类型public:private:// 注册自定义类型// 存储自定义类型// 获取自定义类型return 0;QVariant转换// 定义自定义结构体int id;然后用Q_DECLARE_METATYPE(MyStruct)注册自定义结构体。
2025-03-17 22:30:11
1335
4
原创 SQLiteStudio:一款免费开源跨平台的SQLite管理工具
SQLiteStudio 是一款专门用于管理 SQLite 数据库的图形化工具,由波兰开发者开发并维护。由于 SQLite 以其轻量级、零配置、嵌入式等特性被广泛应用于各种小型项目、移动应用和桌面应用中,而 SQLiteStudio 为用户提供了便捷的方式来管理这些 SQLite 数据库。
2025-03-11 22:27:58
2745
10
原创 一个超级经典的C++序列化&反射库:Cista
在 C++ 的世界里,序列化与反序列化是数据处理中极为重要的环节;而今天要给大家介绍的 Cista,就是在这个领域表现出色的一个库。它以高效、易用的特点,为开发者们提供了强大的支持。Cista(C++ Serialization and Transport Abstraction)是一个轻量级、零依赖的 C++ 序列化库。它的主要目标是提供高效且安全的序列化和反序列化功能,能够处理各种复杂的数据类型,包括自定义结构体、容器等。
2025-03-09 11:15:47
993
5
原创 详解memcpy的实现原理,可不只是逐个字节复制那么简单
memcpy的功能是将src指向的内存区域的前n个字节复制到dest指向的内存区域。使用memcpy,需要注意以下几点:不处理重叠区域(这是memmove的职责)返回目标地址destdest和src都是有效指针内存区域不重叠有足够的空间。
2025-03-08 21:46:37
593
3
原创 C++中使用相对目录的优缺点
最近在一个C++的项目中使用了相对目录,代码如下:在我自己的电脑上程序运行起来,在当前工作目录下可以生成logs目录,而且在logs目录下生成了日志文件ServiceTerminal.txt,但是在同事的电脑上,同样的代码,调试运行却不能生成ServiceTerminal.txt文件,然后在这行代码之前增加打印当前的工作目录代码:经过调试发现currentPath指向的工作目录不对,然后打开工程配置(vs2019工程)发现:调试环境的工作目录配置不对,修改后再次调试,可以生成ServiceTermin
2025-03-08 13:59:22
797
2
原创 C/C++获取结构体成员的偏移量
在 C++ 中,你可以使用标准库中的offsetof宏来获取结构体中某个成员变量相对于结构体起始地址的偏移量。offsetof宏定义在<cstddef>头文件中,它接受两个参数:结构体类型和结构体成员的名称,返回该成员相对于结构体起始位置的字节偏移量。// 定义一个结构体char a;int b;double c;// 获取结构体成员的偏移量return 0;
2025-03-06 20:04:07
1144
6
原创 C++20中的std::bind_front使用及原理分析
与其他替代方案的性能比较1. 与std::bind比较通常比std::bind性能更好,因为它避免了使用占位符带来的参数重排和额外的类型推导开销。std::bind在处理复杂的参数绑定情况时,可能会生成更复杂的代码,导致性能下降。2. 与 lambda 表达式比较简单场景:在简单的参数绑定场景下,和 lambda 表达式的性能相近。编译器对两者都可以进行一定程度的优化。复杂场景:如果需要更复杂的逻辑,例如捕获多个变量、进行条件判断等,lambda 表达式可能更灵活,但也可能会引入更多的代码复杂性。
2025-03-04 20:48:54
1116
8
原创 开源串口数据处理工具Serial Studio(附qml源码链接)
Serial Studio 是一款功能强大且易于使用的串口数据可视化工具。它跨平台的特性、多数据源的支持、高度的定制化能力以及完善的文档,使其成为各种数据采集和可视化项目的理想选择。其开源的特性也使得开发者可以根据自己的需求进行二次开发和定制,进一步拓展其功能。
2025-03-03 21:37:52
1461
3
原创 QT 中的元对象系统(三):QObject深入理解
QObject是 Qt 框架的核心组件,提供了丰富的功能和强大的灵活性,适用于从简单到复杂的各种应用程序开发需求。对象间通信:通过信号与槽机制实现松耦合的设计。内存管理:通过对象树自动管理资源。事件驱动:支持事件处理和扩展。国际化支持:简化多语言应用的开发。动态扩展性:支持动态属性和定时器。在实际开发中,QObject的功能被广泛应用于 GUI 开发、网络编程、嵌入式开发等多个领域。掌握QObject的核心特性对于高效使用 Qt 框架至关重要。
2025-03-03 15:09:14
1693
1
原创 QT 中的元对象系统(二):元对象实现原理QMetaObject
Qt 中的元对象系统,简单的可以分为以下几步:1.在继承 QObject 的类中使用 Q_OBJECT 宏,该宏定义了元对象和相关的方法2.进行 C++ 编译前,Qt 会运行 moc,解析带有 Q_OBJECT 宏的相关类的信息,生成moc文件,得到元数据并构造元对象3.将生成的文件和源文件一起编译Qt 元对象系统通过信号与槽机制、运行时类型信息、动态属性系统和国际化支持等功能,极大地增强了 C++ 的功能,使开发者能够更高效地构建复杂的应用程序。
2025-02-27 22:21:11
1142
8
原创 QT 中的元对象系统(一):元对象和元数据
Qt 作为跨平台的GUI框架,在实际项目中应用广泛,在日常的使用中,随手使用的一些机制(如著名的),属性(如),以及重载各种事件函数来完成定制化;还有中直接访问QObject的Property。等等,有了元系统,使得在掌握很少类内部信息都能完成类数据的获取和方法的调用。
2025-02-25 21:04:40
1093
12
原创 提升效率的C++内存管理技巧
在某些场景下,需要频繁进行内存分配和释放,常规的内存分配方式(如new和delete)会带来显著的性能开销。这是因为每次调用new时,系统都需要在堆上查找合适的内存块,这涉及复杂的算法和系统调用,同样,delete操作也需要对释放的内存进行管理和回收。为了优化这种情况,内存池技术应运而生。内存池是一种内存管理机制,它预先分配一块较大的内存区域,作为内存池。当程序需要分配内存时,优先从内存池中获取,而不是向系统申请新的内存。当内存使用完毕后,也不立即归还给系统,而是将其放回内存池,以便后续再次使用。
2025-02-21 22:39:12
910
5
原创 CrossGuid:C++ 中的跨平台 GUID/UUID 生成库
CrossGuid 是一个轻量级、易于使用且跨平台的 C++ GUID/UUID 生成库。它提供了简单易用的 API,并符合 RFC 4122 标准。如果您正在寻找一个高效且易于使用的 GUID/UUID 生成库,那么 CrossGuid 是一个值得考虑的选择。CrossGuid 官方网站: https://github.com/graeme-hill/crossguid项目地址: https://gitcode.com/gh_mirrors/cr/crossguid。
2025-02-21 10:50:35
881
3
原创 C++ std::atomic可以使用复杂类型(类和结构体)吗
提供轻量、高效的原子操作,适用于不需要复杂锁机制的场景。同时需理解内存顺序对性能和正确性的影响。对于复杂的多操作组合,仍需谨慎处理竞态条件。不当使用load和store导致竞态条件、对内存顺序的误解、复合操作的不原子性。
2025-02-16 20:35:43
1403
16
原创 Qt中基于开源库QRencode生成二维码(附工程源码链接)
QRencode是一个开源的库,专门用于生成二维码(QR Code)。它支持多种编程语言的接口,包括C、C++、Python等。QR码是一种矩阵式二维码,常用于存储网址、联系信息、文字信息等,广泛应用于各种场景,如产品追踪、广告宣传、文档管理等。QRencode的设计简洁高效,提供了易于使用的API接口,使得开发者能够轻松地在应用程序中集成QR码生成和处理功能。
2025-02-16 14:19:51
1902
9
原创 Qt Creator 5.0.2 (Community)用久了突然变得很卡
很久没有用Qt Creator开发项目了,刚刚结束的项目又是用VS2019开发的;这两天刚好有时间去学习一下Qt,刚好要用Qt Creator,结果一打开就没反应,主界面显示出来要好几分钟,最明显的是在Qt Creator的各种鼠标、滚轮操作每做一次都要好几十秒,几乎卡死的情况。
2025-02-14 22:26:58
722
8
原创 Qt信号槽调用出错:Qt: Dead lock detected while activating a BlockingQueuedConnection
是一种信号与槽之间的连接类型,它用于在Qt的事件系统中同步线程间的通信。当你使用这种类型的连接时,发射信号的线程会阻塞,直到接收信号的槽函数执行完毕。这种机制在需要确保信号发射后某些操作必须完成的情况下非常有用,但它也可能导致死锁或性能问题,特别是当多个线程相互等待时。使用场景线程间同步:当你需要在不同线程间同步操作,并且希望确保一个线程的操作在另一个线程继续之前完成。确保顺序执行:在某些情况下,你可能需要确保槽函数的执行顺序与信号的发射顺序一致。注意事项死锁风险:使用。
2025-02-14 14:29:58
922
1
原创 C++ 洗牌函数std::shuffle的用法
是 C++ 标准库中用于对序列进行随机重排(洗牌)的一种算法。它可以将容器(例如std::array、或普通数组等)中的元素随机地打乱顺序,就像洗扑克牌一样。与早期的相比,要求使用一个随机数引擎(如),从而在提供更可控、更安全的随机生成方式的同时,也避免了潜在的随机质量问题。这个算法定义在头文件中,并且需要 C++11 或更高版本的支持。:可随机访问的迭代器类型(Random Access Iterator),例如指向std::array或内置数组的指针等。
2025-02-13 22:20:24
1438
4
原创 C++ Lambda 表达式的本质及原理分析
是一个匿名类,其捕获的变量存储为类的成员变量,调用时通过重载的operator()实现。值捕获是将外部变量的副本存储为类成员,引用捕获是将外部变量的引用存储为类成员。使用 Lambda 时,需要特别关注变量的生命周期和捕获方式,以避免未定义行为。Lambda 表达式在 C++ 中提供了极大的灵活性和简洁性,特别是在需要定义短小的回调函数或处理算法时。理解并熟练使用 Lambda 表达式可以显著提升代码的可读性和效率。
2025-01-27 22:34:44
2215
10
原创 C++标准线程库实现优雅退出的方式
spdlog一个非常好用的C++日志库(五): 源码分析之线程池thread_pool_spdlog源码分析-CSDN博客log, //普通日志消息flush, //冲刷日志消息到目标(sink)terminate //终止线程池子线程(工作线程)// 析构函数不要抛出异常, 但释放线程池资源资源可能发生异常, 因此内部捕获并处理SPDLOG_TRYi++) {t.join();// 子线程循环// 从环形缓冲区取出数据if (!dequeued)
2025-01-27 21:30:13
829
4
浮点数与十六进制转换工具
2024-01-22
C++设计模式例程,工厂模式例子
2024-01-15
高质量 C++编程指南,编程的好书籍
2023-12-26
C++模板函数重载规则详解
2023-12-26
sscom 串口调试工具
2023-12-20
NetAssist 网络调试工具
2023-12-20
基于C++CORBA高级编程
2023-12-13
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人