C++ 开发技巧总结
文章平均质量分 80
介绍C++高级语法、C++ 11、多线程、线程池等技术,C++数据库操作,C++常用开发组件的使用,提供全部源码.
余额抵扣
助学金抵扣
还需支付
¥19.90
¥99.00
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
令狐掌门
C++程序员,出版过《C++零基础入门视频教程》、《Qt高级进阶视频教程》、《C++ Qt6 QtQuick/QML入门进阶视频教程》、《PyQt PySide6零基础入门与项目实战》、《OBS源码分析与桌面录制视频教程》。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
windows编译x264
本篇博客介绍 **完整可用的 MSVC 编译 x264 流程**(Windows 11 + VS2022)。原创 2026-03-03 10:15:14 · 156 阅读 · 0 评论 -
C++20协程深度解析与实践指南
C++20 引⼊的协程(Coroutines)是⼀种特殊的函数,它能够在执⾏过程中被挂起(suspend),并在未来的某个时间点从挂起的位置恢复(resume)执⾏ 。这种机制使得编写异步代码变得如同编写同步代码⼀样直观,极⼤地简化了传统异步编程中复杂的回调函数(callback hell)和状态机逻辑 。原创 2025-11-13 08:22:40 · 263 阅读 · 0 评论 -
C++ std::unordered_map使用结构体为key与自定义哈希函数
在使用std::unordered_map时常见的是用基本数据类型作为key, 例如int、string等等,如果用到自定义类型,例如结构体或者类,那么就要需要额外提供第 3 个参数"哈希函数",有时候还要提供第 4 个参数"相等比较器"。所以 unordered_map 一般有 最多五个模板参数。原创 2025-09-20 15:58:15 · 439 阅读 · 0 评论 -
C++ std::hash的用法
如果你有一个自定义结构体,要想放到或里,必须提供std::hash。struct是一个模板类,实例化后就是哈希函数对象。常用于等哈希容器。标准库已经为基本类型和常见类型实现了std::hash。对于自定义类型,要么写单独的哈希器结构体,要么特化std::hash。原创 2025-09-20 15:46:31 · 299 阅读 · 0 评论 -
如何防止sqlite会出现数据库文件损坏的问题
SQLite数据库可能因断电、硬件故障或文件系统错误而损坏。预防措施包括使用事务、开启WAL模式、配置同步模式以及定期备份。若发生损坏,可使用PRAGMA integrity_check检测,并通过.dump或.recover命令尝试修复数据。SQLite内置机制能有效降低损坏风险,但备份仍是关键保障。原创 2025-08-06 10:56:08 · 563 阅读 · 0 评论 -
Linux epoll简介与C++TCP服务器代码示例
epollselectpoll每次调用都把全部文件描述符从用户态拷贝到内核态,随连接数增长而线性变慢;epoll采用事件驱动就绪队列的方式,内核只把“已就绪”的描述符返回给用户态,O(1) 规模扩展;支持边沿触发 Edge-Triggered (ET)与水平触发 Level-Triggered (LT)两种模型,便于构建高性能网络服务。原创 2025-07-10 14:35:14 · 353 阅读 · 0 评论 -
C++ tcp客户端处理重连问题
TCP客户端确实可能因为各种原因与服务端断开连接。原创 2025-07-07 17:24:11 · 518 阅读 · 0 评论 -
C++实现状态机
状态机,全称为有限状态机(Finite State Machine, FSM),是一种用来表示有限个状态以及在这些状态之间如何转移和响应的数学计算模型。[1][2]简单来说,它是一个抽象机器,在任何给定时间点,它都只能处于一个确定的状态。[1][3]当某个事件(输入)发生时,它会从当前状态转换到另一个状态,这个过程称为“转换”(Transition)。[1]可以将状态机看作是一种描述系统行为的强大工具,尤其适用于那些行为模式依赖于其内部历史状态的系统。[4]原创 2025-07-02 14:07:07 · 361 阅读 · 0 评论 -
C++ TCP传输心跳信息
在C++ TCP程序中实现心跳机制是保持连接活跃、检测连接状态的重要手段。原创 2025-06-03 16:41:41 · 522 阅读 · 0 评论 -
C++ Protocol Buffers使用介绍
proto文件是 Protobuf 的核心,它定义了数据结构(称为 “message”)以及服务接口(可选,用于 gRPC)。消息 (Message):类似于 C++ 中的类或结构体,用于组织数据。每个消息包含一系列带类型的字段。字段 (Field):消息中的数据单元,每个字段都有一个名称、一个类型和一个唯一的编号(tag)。类型:可以是基本数据类型(如int32stringboolbytes),也可以是其他消息类型(嵌套消息),还可以是枚举类型 (enum编号 (Tag)原创 2025-06-03 08:48:22 · 335 阅读 · 0 评论 -
C++ TCP程序增加TLS加密认证
TCP程序添加TLS主要是为了解决TCP协议本身的安全缺陷。:TCP传输的数据完全暴露在网络中,任何能够监听网络流量的人都可以直接读取传输内容。这对于敏感信息(如密码、个人资料、商业机密)来说是极其危险的。:恶意攻击者可以在传输过程中修改数据包内容,而接收方无法检测到这种篡改。这可能导致数据完整性被破坏,影响应用程序的正常运行。:TCP连接无法验证通信双方的真实身份,攻击者可以轻易伪装成合法的服务器或客户端,进行中间人攻击。:攻击者可以捕获并重新发送之前的数据包,可能导致重复操作或其他安全问题。原创 2025-05-30 18:30:39 · 695 阅读 · 0 评论 -
贪心算法原理以及C++实现
贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法策略。它不考虑历史的选择,也不试图回溯或修正之前的选择。“目光短浅”:只考虑局部最优解,希望这些局部最优解能最终组合成一个全局最优解。特点:无后效性(No Aftermath):当前的选择不会对后续子问题的求解产生影响。局部最优选择(Locally Optimal Choice):每一步都选择当前看来最好的方案。不可撤销(Irreversible):一旦做出选择,就不能改变。原创 2025-05-29 10:20:11 · 396 阅读 · 0 评论 -
C++快速排序原理解析
快速排序是一种分治法(Divide and Conquer)思想的排序算法,其主要思想是:(1)选取一个基准元素(pivot),通常可以选择数组的第一个、最后一个、中间一个或随机一个元素。(2)分区(partition):将数组分成两部分,左边部分的元素都小于基准元素,右边部分的元素都大于基准元素。(3)递归排序:对左右两个子数组分别递归地进行快速排序。原创 2025-05-29 10:04:57 · 146 阅读 · 0 评论 -
C++ explicit关键字有什么作用
C++ 中的explicit关键字主要用于。原创 2025-05-28 17:18:25 · 365 阅读 · 0 评论 -
C++链式调用与Builder模式
链式调用的核心是成员函数返回*this(引用)。适用于提高代码可读性和流畅性,常见于 Builder 模式和流式接口。注意返回类型的正确性(引用而非值)和 const 正确性。原创 2025-05-28 16:31:50 · 1117 阅读 · 0 评论 -
linux libdbus使用案例
以下是一个基于 Linux libdbus 的详细指南,包含服务端和客户端的完整代码示例,涵盖 方法调用、信号发送 和 异步消息处理。libdbus 是 D-Bus 的底层 C 库,直接操作 D-Bus 协议,适合需要精细控制的场景。实现一个服务端,提供 方法并发送 信号。3. 客户端代码客户端调用 方法并监听 信号。4. 编译与运行(1) 安装依赖(2) 编译代码(3) 运行示例终端 1(服务端):终端 2(客户端):(4) 预期输出服务端:客户端原创 2025-05-16 00:04:19 · 436 阅读 · 0 评论 -
gRPC为什么高性能
gRPC 之所以具备高性能的特性,主要得益于其底层设计中的多项关键技术优化。这些设计使其在吞吐量、延迟和资源利用率上远超传统 RESTful API,尤其适合对性能要求严苛的分布式系统。gRPC 的高性能源于。原创 2025-05-15 23:54:39 · 506 阅读 · 0 评论 -
linux dbus
主要用于Linux桌面环境和系统服务之间的消息传递。它允许不同的应用程序或系统组件以高效、安全的方式相互通信,是现代Linux桌面(如GNOME、KDE)的核心基础设施之一。通过D-Bus,Linux实现了高度模块化的系统设计,使得不同组件可以松耦合地协作。它是理解现代Linux桌面和服务交互的关键技术之一。Linux D-Bus(Desktop Bus)是一种。原创 2025-05-15 23:38:50 · 814 阅读 · 0 评论 -
linux C++ GDBus代码示例
GDBus 提供了高度封装的 D-Bus 通信能力,通过 GLib 的异步支持和类型系统,能够实现高效、安全的进程间通信。适用于需要与 GNOME 桌面服务或其他系统组件交互的应用程序。通过 GDBus 的简洁接口,可以更高效地实现 D-Bus 通信。可大幅简化开发流程,推荐在需要复杂接口交互时使用。的详细指南,包含服务端和客户端的完整实现,覆盖。(为简化示例,下文代码手动实现接口)。创建一个 XML 文件定义接口(本示例实现一个简单的。原创 2025-05-15 23:51:05 · 505 阅读 · 0 评论 -
C++内部类用法介绍
是在另一个类的作用域内定义的类。它的主要作用是封装逻辑关系紧密的类,使其不能被外部直接访问,从而增强封装性和代码的可读性。内部类不能直接访问外部类的成员,但可以通过外部类对象的引用或指针来访问。内部类是 C++ 代码组织的重要手段,使用得当可以提高代码的。如果内部类需要直接访问外部类的私有成员,可以将其声明为。,这决定了外部类和外部代码对其访问的权限。内部类可以用来封装某些结构或节点,例如。的内部类,实现了自定义迭代器的功能。的友元类,所以它可以直接访问。内部类不能直接访问外部类的非。原创 2025-02-28 17:12:24 · 166 阅读 · 0 评论 -
C++使用线程池模拟异步事件处理机制
在C++很多框架中都有异步事件处理机制,这导致我们在看源码时经常很疑惑,难以理解,而其中包含的编程套路可能是一些成熟的技术,只是我们不熟悉,比如WebRTC中类似于Qt的信号槽机制,线程事件处理, 或者使用系统异步IO等等,如果看不懂这些套路,理解代码会很难,本篇博客来尝使用用C++线程池实现一种异步事件处理机制。原创 2023-11-11 15:06:04 · 857 阅读 · 0 评论 -
C++线程任务队列模型
这个程序实现了一个简单的任务队列,其中任务类表示一个可执行的任务,具有状态(未开始、进行中、已完成)。任务队列类负责管理任务的添加和执行,执行方式为串行执行。每个任务的执行时间是随机的,并且在执行过程中会输出当前的进度信息。在任务队列中添加2个任务并执行,所有任务完成后退出程序。串行任务队列开始执行,共有2个任务。实现一个任务队列,用于任务的执行。任务1开始执行,将运行3秒。任务2开始执行,将运行2秒。串行队列执行输入示例如下。任务1已完成100%任务2已完成100%原创 2024-05-29 01:15:16 · 693 阅读 · 0 评论 -
C malloc经典面试题解答与分析
本篇博客介绍关于C malloc经典的错误代码写法以及解决方法。原创 2024-06-21 21:30:00 · 1324 阅读 · 0 评论 -
C++ vector操作总结
推荐insert是最直观且高效的方法,适用于大多数场景。注意:如果需要保留原始向量不变,可以先创建副本,然后操作副本。性能和std::copy都是高效的批量操作,但在处理非常大的向量时,std::move可以减少复制开销。如果使用 C++17 或更低版本,推荐方法 1或方法 2,它们兼具易读性和性能。如果使用 C++23,是最现代的实现方式,代码更加简洁。使用std::sort搭配 Lambda 表达式是最简洁的实现方式。原创 2024-11-20 21:40:20 · 509 阅读 · 0 评论 -
C++ enable_shared_from_this使用详解
enable_shared_from_this 是 C++ 标准库中提供的一个辅助类模板,主要用于支持对象从成员函数中安全地获得一个 shared_ptr 指向它自己。它的作用是允许对象在其成员函数内部生成指向它本身的 shared_ptr,从而确保对象在生命周期管理中的正确性,特别是在对象存在于多个地方并且需要共享所有权时。原创 2024-11-08 21:29:50 · 588 阅读 · 0 评论 -
C++ std::optional用法介绍
是 C++17 引入的一个模板类,它提供了一种表达可选值的方式,即一个变量可以包含一个有效值或者不包含值(即为空)。这在处理可能返回空值的函数或者值可能不存在的情况下特别有用。原创 2024-11-06 20:57:50 · 359 阅读 · 0 评论 -
CMake教程:C++ CMake自定义find_package并在其它项目使用
find_package 是 CMake 中一个非常重要的命令,用于在系统中找到外部库或包,并将其包含到项目中。: 要查找的包的名称。[version]: 可选的版本号。如果指定了版本号,CMake 会尝试找到该版本或更高版本的包。[REQUIRED]: 如果指定了这个关键字,找不到包时会产生一个错误并终止配置过程。: 指定要查找的包的组件。: 指定可选的组件,即使找不到这些组件,配置过程也会继续。: 指定查找包的模式,CONFIG表示查找配置文件,MODULE表示查找模块文件。原创 2024-07-22 22:22:57 · 1518 阅读 · 0 评论 -
C++如何把图片转成base64数据
在C++中将图片转换为Base64格式涉及几个步骤,主要是读取图片文件的二进制数据,然后将这些数据编码为Base64字符串。这个过程通常需要用到额外的库来辅助完成,例如使用开源库如OpenSSL来进行Base64编码,以及使用标准库来处理文件输入输出。运行程序之前,确保修改文件路径为实际图片文件的路径。这个程序将输出Base64编码的字符串,可用于网页显示或其他需要Base64编码的场景。首先,确保你的系统中安装了OpenSSL库。原创 2024-04-15 21:27:32 · 605 阅读 · 0 评论 -
C++ std::copy和copy_if用法介绍
在C++标准库中,std::copy 和 std::copy_if 是算法库的一部分,用于复制一系列元素。std::copy 函数用于将一系列元素从一个容器复制到另一个容器。这个函数在 头文件中定义。原创 2023-12-01 08:44:26 · 965 阅读 · 0 评论 -
C++ vector pair用法介绍
作者:令狐掌门技术交流QQ群:675120140。原创 2023-11-30 09:17:02 · 1871 阅读 · 0 评论 -
C++ 17实现无锁队列
在软件编程中,无锁队列是一种特殊类型的数据结构,它允许多个线程在不使用传统互斥锁(如mutexes)的情况下进行并发访问。无锁队列通过使用原子操作来确保线程安全,原子操作是一种不可中断的操作,它可以在单个步骤中完成,无需锁定资源。性能提升:无锁队列通常比使用锁的队列有更好的性能,因为它们避免了锁的开销,包括上下文切换、线程调度延迟和潜在的死锁问题。可扩展性:在多处理器系统中,无锁队列可以更好地扩展。随着处理器数量的增加,使用锁的队列可能会遇到瓶颈,因为多个线程竞争同一个锁。原创 2023-11-29 09:23:30 · 1459 阅读 · 0 评论 -
尝试用C++从实现一个可用的内存池
作者:令狐掌门技术交流QQ群:675120140。原创 2023-11-29 09:22:59 · 1164 阅读 · 0 评论 -
Linux POSIX C/C++线程API介绍与代码演示
Linux POSIX API(Application Programming Interface)是一组用于编写可移植的多线程、进程间通信、文件操作等系统级应用程序的标准接口。它遵循POSIX(Portable Operating System Interface for Unix)标准,POSIX是一组定义了操作系统接口的标准,旨在提高可移植性和互操作性。Linux POSIX API提供了许多函数和数据类型,用于创建和管理线程、进程间通信、文件操作、信号处理、互斥锁、条件变量等。原创 2023-08-10 22:17:35 · 1034 阅读 · 0 评论 -
Linux C++ 网络编程基础(2) : TCP多线程一个server对应多个client
Linux POSIX线程库提供了一组函数来创建、管理和同步线程。:创建一个新的线程。return 0;:等待一个线程的结束。return 0;:初始化一个互斥锁。return 0;:初始化一个条件变量。return 0;原创 2023-08-10 21:48:47 · 2206 阅读 · 0 评论 -
Linux C++网络编程基础(1):TCP服务端与客户端的实现
这两段代码分别实现了一个简单的服务器和客户端。服务器创建一个socket,绑定到一个特定的端口,并开始监听这个端口。当一个客户端连接到这个端口时,服务器接收客户端发送的消息,然后向客户端发送一个响应。在Linux环境下,我们可以使用socket编程来实现网络通信。下面是一个简单的C++版本的客户端和服务端的示例代码。这只是一个非常基础的示例,实际的网络编程可能会涉及到更复杂的情况,比如多线程或者非阻塞IO等。客户端创建一个socket,连接到服务器的特定端口,发送一个消息,然后等待服务器的响应。原创 2023-08-07 16:48:07 · 2054 阅读 · 0 评论 -
vscode ssh linux C++ 程序调试
vscode调试c++程序相比vs2022要复杂很多,vs2022可以"一键运行调试",vscode则需要自己配置。vscode调试程序时,会在当前工作目录产生.vscode目录, 该目录有两个重要文件和tasks.json, 下面介绍两种调试方法: 手动调试和自动调试。原创 2023-10-09 23:41:54 · 1306 阅读 · 0 评论 -
C++实现线程安全的vector
如果你需要支持迭代器,你可能需要使用一个不同的设计,例如,你可以返回一个持有锁的“代理”对象,该对象在析构函数中释放锁。的每个操作都是线程安全的,但如果你需要进行多个操作并且这些操作需要一起原子地(atomically)完成,那么你可能需要在你的代码中添加额外的同步。如果你的应用程序需要更高的并行性,你可能需要使用更复杂的数据结构或同步策略,例如,你可以使用一个并行数据结构库,或者实现一个读写锁策略,允许多个线程同时读取vector。方法,因为在调用这两个方法之间,其他线程可能已经修改了vector。原创 2023-11-20 20:35:15 · 1006 阅读 · 0 评论 -
C++实现线程安全的map
是C++17标准中引入的一种新的线程同步原语。它是一个允许多个读取者与单一写入者并发访问共享数据的互斥锁。共享锁定(Shared Locking):在共享锁定期间,其他线程可以同时获取共享锁定,但不能获取独占锁定。这通常在只读操作中使用,因为多个线程可以同时读取数据,而不会彼此干扰。独占锁定(Exclusive Locking):在独占锁定期间,其他线程既不能获取共享锁定,也不能获取独占锁定。这通常在写入操作中使用,以确保数据在写入期间不会被其他线程修改。lock(): 获取独占锁定。原创 2023-11-20 20:32:58 · 1147 阅读 · 0 评论 -
C++17 string_view用法介绍
这个内存池使用一个vector来存储内存块,每个内存块的大小为blockSize。allocate函数会从freeList中取出一个内存块并返回,如果freeList为空,则会调用expandPool函数来扩展内存池。在示例中,我们使用内存池来分配和释放int类型的内存块。首先,我们分配一个内存块并将其赋值为42,然后再分配一个内存块并将其赋值为99。最后,我们释放这两个内存块。请注意,这只是一个简单的内存池实现示例,实际的内存池可能需要更复杂的管理和分配策略,以及对内存对齐和内存泄漏等问题的处理。原创 2023-08-07 16:21:27 · 512 阅读 · 0 评论 -
c++ http url encode decode
这些代码示例演示了如何使用C++对URL进行编码和解码。请注意,这些示例仅处理URL中的特殊字符,而不处理URL中的查询参数等其他部分。如果需要处理更复杂的URL,请使用相应的URL库或框架。原创 2023-08-01 11:56:59 · 1489 阅读 · 0 评论
分享