- 博客(106)
- 收藏
- 关注
原创 Linux C/C++ 学习日记(80):Kafka(八):topic会自动创建吗?
摘要:本文分析了Kafka的Topic自动创建机制,重点解析了Broker端配置auto.create.topics.enable的作用机制。该配置默认为true,当生产者向不存在的Topic发送消息或消费者订阅不存在Topic时都会触发自动创建,新Topic默认配置为1个分区和1个副本。通过命令行实操验证了两种触发场景,并观察到LEADER_NOT_AVAILABLE警告是创建后的正常短暂延迟现象。特别指出生产环境应关闭此功能,改为手动创建Topic以确保配置符合业务需求。最后提到2.x版本中C++客户端
2026-03-08 15:12:39
386
原创 Linux C/C++ 学习日记(79):Kafka(七):生产者代码:含源码解析
本文介绍了Kafka生产者C++客户端的实现要点,主要包含以下内容: 核心配置项:包括Kafka集群地址、ACK级别、重试次数等必配参数,确保消息可靠性。 关键回调函数:必须重写投递回调(dr_cb)和事件回调(event_cb)来监控消息投递状态和集群异常。 生产者实现细节: 使用RK_MSG_COPY保证内存安全 实现Topic对象缓存机制 处理队列满等异常情况 完善的统计指标(生产/投递成功/失败数) poll()机制:驱动异步任务处理,包括消息发送、回调触发等。 企业级特性: 单例管理器统一管理生产
2026-03-08 15:12:25
584
原创 Linux C/C++ 学习日记(78):Kafka(六):消费者代码(4):代码解析(附源码)
本文介绍了一个基于C++的Kafka消费者实现方案,采用分层设计和单例模式架构。代码包含配置层、管理层、状态层、回调层和核心业务层五个模块,支持多消费者实例管理、批量消息处理、手动位移提交和优雅关闭等功能。关键特性包括:1)单例模式统一管理消费者实例;2)手动位移提交保证数据不丢失;3)信号处理和析构函数实现优雅关闭;4)原子操作和互斥锁确保线程安全;5)完善的日志系统便于监控。实现细节涵盖了消费者初始化、消息处理、批量提交和重平衡处理等核心流程,并提供了完整的代码示例。
2026-03-08 00:42:24
436
原创 Linux C/C++ 学习日记(77):Kafka(五):消费者代码(3):订阅、消费、重平衡、日志
本文介绍了Kafka消费者API的核心功能和使用要点。主要内容包括:1)rebalance_cb回调方法处理消费组重平衡事件;2)assign/unassign方法手动分配/释放分区;3)subscribe方法启用消费组自动分区分配;4)consume/poll方法拉取消息;5)event_cb回调处理各类事件。重点分析了手动assign在消费组模式下的风险:会绕过协调器管控,导致分区重复消费。正确做法是:消费组模式下必须使用subscribe,仅在rebalance_cb中调用assign;非消费组模式才
2026-03-07 18:38:59
378
原创 Linux C/C++ 学习日记(76):Kafka(四):消费者代码(2):配置设置
本文详细介绍了Kafka消费者的配置与使用要点。主要内容包括:1)核心配置分为必须项(bootstrap.servers和group.id)和可选项(如offset提交策略、批量拉取参数等);2)全局配置与主题配置的区别及实际应用场景,包括如何为不同主题设置差异化配置;3)subscribe方法的两种传参方式及其底层行为差异,以及重复调用的注意事项。文章通过具体代码示例,阐述了生产环境中配置消费者的最佳实践和常见陷阱。
2026-03-07 18:38:41
380
原创 Linux C/C++ 学习日记(75):Kafka(三):消费者代码(1):offset的含义和相关操作
本文介绍了Kafka消息offset的概念和相关API。offset分为消息offset(分区内唯一递增序号)和消费offset(消费者提交的位移)。文章详细解析了offset的常量含义(如OFFSET_BEGINNING从当前最早消息开始)、自动提交机制(默认5秒提交一次)及其风险(可能丢失未处理消息)。重点说明了核心API,包括同步/异步提交方式、手动指定offset的场景,以及如何通过assign()方法精确控制消费起始位置。建议生产环境关闭自动提交,改为业务处理成功后手动提交offset,以确保消息
2026-03-07 13:55:18
467
原创 Linux C/C++ 学习日记(74):Kafka(二):环境的搭建及常用的指令
本文记录了Java环境和Kafka的安装部署流程。首先详细说明了JDK8的下载、解压、环境变量配置及验证步骤。接着介绍了Kafka 2.0.0的下载安装,包括使用内置Zookeeper的启动方法(2181端口)和Kafka服务启动(9092端口)。最后讲解了Kafka基本操作:创建/查看主题、生产消费消息,以及主题管理(分区修改、删除等注意事项)。文档特别强调副本因子不能超过broker数量,并指出删除主题需要先设置delete.topic.enable=true。所有操作均配有具体命令示例和参数说明。
2026-03-06 19:51:56
381
原创 Linux C/C++ 学习日记(73):Kafka(一):基本介绍
本文系统介绍了消息队列及Kafka的核心概念与应用。消息队列通过解耦生产者和消费者,提供异步通信、流量削峰等优势。Kafka作为分布式消息系统,包含Producer、Consumer、Broker等核心组件,采用分区和副本机制实现高吞吐和高可用。重点阐述了:1)消息存储机制与副本同步原理;2)生产者分区策略(轮询/Key哈希/自定义);3)消费者组与四种分区分配策略(Range/RoundRobin/Sticky/CooperativeSticky)的对比;4)通过ISR机制和ACK应答(0/1/-1)实现
2026-03-06 16:51:40
462
原创 Linux C/C++ 学习日记(72):grpc(五):基于grpc编写异步server和client(2):代码书写
本文详细介绍了gRPC异步通信的实现方案,包含服务端和客户端的单CQ/多CQ两种模式。服务端采用基于状态机的OOP设计,通过继承CallData基类实现四种RPC类型(一元、服务端流、客户端流、双向流)。客户端提供OOP和枚举两种实现方式,推荐使用基于继承的OOP方案。文章重点分析了多CQ与单CQ的差异,包括成员变量管理、线程处理、资源分配等关键点,并对比了不同实现方式的优缺点,强调OOP设计在可扩展性和可维护性上的优势。
2026-03-06 14:22:42
529
原创 Linux C/C++ 学习日记(71):grpc(四):基于grpc编写异步server和client(1):常用api前置知识
本文系统介绍了gRPC异步编程的核心机制:1)服务端通过CompletionQueue(CQ)实现异步事件驱动模型,详细解析了CQ工作原理、tag/ok参数含义及状态机流转;2)客户端异步API的三步调用流程;3)流式RPC的优雅关闭机制,强调WritesDone()与Finish()的差异及正确使用方式;4)深入对比了同步/异步场景下服务端与客户端Finish操作的语义差异。文章提供了完整的异步编程规范,包括状态机设计、单Pending原则、资源管理及异常处理等最佳实践,为构建高性能gRPC服务提供了详细
2026-03-06 12:40:40
543
原创 Linux C/C++ 学习日记(70):grpc(三):基于grpc编写同步的server、client
本文介绍了gRPC四种通信模式的实现方法,包括一元RPC、服务端流式、客户端流式和双向流式RPC。通过proto文件定义服务接口,并分别给出了同步服务端和客户端的C++实现代码。详细说明了每种模式下消息的发送和接收时机:一元RPC同步完成请求响应;流式模式下通过Write()即时发送数据,通过Read()阻塞接收数据,使用WritesDone()标记发送结束。文章还总结了不同模式下客户端和服务端的数据收发流程,为gRPC同步通信提供了清晰的实现参考。
2026-03-05 20:00:34
892
原创 Linux C/C++ 学习日记(69):grpc(二):.proto文件的书写
本文详细介绍了gRPC的.proto文件核心结构及语法要点。文件包含版本声明、包名定义、选项配置、消息定义和服务定义五个部分。重点说明了消息定义规则(字段编号分配、常用类型)和四种RPC类型(一元、服务端流、客户端流和双向流)。文章还演示了如何通过import复用其他proto文件,并解释了proto包名与C++命名空间的对应关系。最后提供了完整的登录模块示例,展示请求/响应消息定义和服务接口声明,特别强调了proto3语法和跨文件类型引用的规范用法。
2026-03-05 12:28:56
464
原创 C/C++内置库函数(7):lambda表达式
本文详细介绍了C++中Lambda表达式的基础语法和核心特性。主要内容包括:1)Lambda的完整语法结构,重点解析了捕获列表和函数体这两个必需部分;2)捕获列表的五种构建方式(空捕获、值捕获、引用捕获、隐式捕获和初始化捕获);3)三个实用特性:mutable修饰符、泛型Lambda(C++14)以及作为回调函数的应用场景。Lambda表达式通过灵活的捕获机制和简洁的语法,特别适合作为STL算法的回调函数,极大提升了代码的简洁性和可读性。
2026-03-05 00:45:04
231
原创 Linux C/C++ 学习日记(68):grpc(一):配置grpc环境,及CMakeLists.txt模板
本文详细介绍了gRPC环境的搭建与测试流程。主要内容包括:1)通过Git获取gRPC源码并选择v1.45.2版本;2)下载第三方依赖库后目录大小增至1.3G;3)编译安装步骤;4)强调必须使用grpc自带的protobuf进行编译安装;5)成功测试helloworld示例;6)提供完整的CMakeLists.txt模板,支持多协议生成和批量编译目标。文章还解释了关键CMake变量含义,为gRPC开发提供了完整的环境配置指南。
2026-03-04 20:56:45
68
原创 Linux C/C++ 学习日记(67):Redis(八):实现redis连接池,应用于项目当中
本文介绍了一个基于hiredis的Redis连接池实现,主要包含三个核心类: CacheConn类:封装Redis连接操作,提供字符串、哈希、列表、有序集合等数据类型的操作方法,并处理连接初始化与重连逻辑。 CachePool类:管理连接池,包括连接的创建、获取和回收,支持最大连接数限制和超时等待机制。 CacheManager类:作为连接池管理器,支持从配置文件读取多个Redis实例配置,并统一管理各实例的连接池。 该实现具有以下特点: 线程安全,使用mutex和condition_variable实现同
2026-03-04 15:19:57
277
原创 Linux C/C++ 学习日记(66):Redis(七):redis的高可用性
Redis内存管理与持久化策略总结 内存管理: 通过expire/pexpire设置过期时间,maxmemory限制内存使用(建议设为物理内存一半) 提供多种淘汰策略(LRU/LFU/TTL/random),范围可选volatile或allkeys 持久化方案: RDB:定时快照,文件小恢复快但可能丢失数据 AOF:记录操作日志,数据更可靠但文件较大 混合持久化:结合RDB快照和AOF增量操作 主从同步: 异步复制确保主节点高性能 通过复制偏移量和积压缓冲区实现断线重连后的增量同步 哨兵模式实现自动故障转移
2026-03-04 13:31:06
588
原创 Linux C/C++ 学习日记(65):Redis(六):论”单线程“服务器是如何实现高性能的,含部分源码剖析
本文分析了Redis在高性能架构设计中的关键技术,主要包括线程模型优化和数据结构编码策略两大部分: 线程优化方面: 采用主线程+IO子进程的Reactor模型,主线程处理核心逻辑保持线程安全 通过fork子进程处理磁盘IO,异步刷盘机制优化AOF持久化 渐进式rehash和数据迁移分摊CPU密集型操作 数据结构编码策略: 动态编码转换机制:根据数据量和操作类型在紧凑编码(ziplist/intset)和高效编码(dict/skiplist)间自动切换 字符串优化:数字用int编码(≤20位),短字符串用em
2026-03-03 16:27:57
2018
原创 Linux C/C++ 学习日记(64):Redis(五):同步连接与异步连接代码实现,含部分接口源码分析
本文对比分析了Redis同步与异步连接的实现方案。同步连接采用阻塞IO,代码逻辑直观但会阻塞线程;异步连接基于非阻塞IO,通过事件循环和回调函数实现高性能,但代码复杂度较高。文章详细介绍了两种连接的API接口、内存管理机制和典型使用场景,并提供了C语言实现示例。特别深入剖析了异步连接的核心机制,包括事件循环适配、回调函数处理和连接状态管理。最后总结了两种方案在连接方式、结果获取、线程安全等方面的差异,帮助开发者根据实际场景选择合适的连接方式。
2026-01-15 21:31:00
1069
原创 配置(13):给Vmware中的ubuntu扩容(只适用LVM分区)
摘要:本文介绍Ubuntu Server 22.04系统下LVM分区的扩容方法。首先通过lsblk、vgdisplay等命令判断是否为LVM分区,确认后关闭虚拟机并在VMware中扩展虚拟磁盘。系统启动后执行lvextend分配卷组空闲空间,使用resize2fs扩展文件系统。关键步骤包括确认卷组名和逻辑卷路径,整个过程支持在线操作无需卸载分区。最后通过df -h/验证扩容结果,演示了从50G扩容到100G的完整流程。
2026-01-15 13:56:41
889
原创 Linux C/C++ 学习日记(63):Redis(四):事务
Redis事务是一种批量命令的有序集合,通过MULTI/EXEC命令实现命令的打包执行,保证命令的顺序性和原子性。但与传统数据库事务不同,Redis事务不支持回滚,仅能处理入队错误和执行错误两种场景。Redis事务具有弱一致性,不满足严格的ACID特性,其中隔离性完全满足,原子性部分满足,持久性依赖持久化策略。实现方式包括原生事务和Lua脚本,后者支持复杂逻辑且性能更优。Redis还提供WATCH命令实现乐观锁机制。Lua脚本的SHA编码可提升执行效率,需配合预加载策略保证重启后可用。实际应用中,建议根据业
2026-01-14 23:34:17
736
原创 Linux C/C++ 学习日记(62):Redis(三):订阅
Redis发布订阅(Pub/Sub)是Redis提供的轻量级消息通信机制,基于频道和模式实现一对多的消息广播。核心指令包括SUBSCRIBE/PSUBSCRIBE(订阅)、PUBLISH(发布)等,订阅者会进入阻塞状态。适用于实时通知、配置同步等场景,但存在无持久化、无确认机制等局限性,不适合高可靠性要求的场景。与List实现的消息队列相比,Pub/Sub是广播模型且不存储消息,而List支持消息持久化和堆积。使用时需注意普通频道与模式是分开管理的,发布者无需订阅者存在即可发布消息。该机制简单易用但可靠性有
2026-01-14 20:04:59
667
原创 配置(12):snipaste截图软件
《Snipaste截图工具使用指南》介绍了这款实用截图软件的安装与使用方法。文章分为下载安装、配置和使用三个步骤:首先从官网下载压缩包;解压后设置开机自启和管理员权限;最后详细说明快捷键操作、图片编辑功能,特别推荐其"截图暂留屏幕"的特色功能。全文简洁明了地指导用户快速掌握Snipaste的核心功能,重点突出了该软件便捷的截图编辑和屏幕暂留特性。
2026-01-14 14:35:09
52
原创 Linux C/C++ 学习日记(60):Redis(一):基本介绍
Redis是一款开源高性能键值对内存数据库,支持多种数据结构和持久化。核心特点包括超高读写性能(单机QPS达10万+)、丰富数据结构、原子操作和分布式能力。主要应用于数据缓存、分布式协调、临时数据存储、消息传递和复杂计算等场景。与传统关系型数据库相比,Redis以内存操作为主,适合高频读写和分布式场景,但不支持复杂查询和强事务。典型应用包括缓存热点数据、实现分布式锁、构建排行榜系统等。
2026-01-13 23:24:00
583
原创 配置(11):vscode中使用bookmarks扩展
本文介绍了在VSCode中使用Bookmarks插件的完整流程:首先安装插件,然后在设置中启用bookmarks.json配置文件。重点说明了两种添加书签的方法:一是通过快捷键或右键菜单实时添加(自动更新配置文件),二是直接编辑bookmarks.json文件(需重启生效)。配置文件包含文件路径、行号、列号和书签标题等关键信息。两种方法各有利弊,用户可根据需求选择使用。
2025-12-25 13:43:23
569
原创 配置(10):通过源码安装redis
本文详细介绍了Redis源码安装及使用指南:1)从安装编译依赖、下载源码到编译安装全过程;2)提供Redis关键配置说明(持久化、日志等)及systemd服务配置方法;3)演示基础操作命令;4)重点讲解C语言通过hiredis库连接Redis的完整流程,包括代码示例和编译方法;5)最后给出完整的卸载指南。文档涵盖Redis服务器部署、配置优化、客户端开发全流程,适合开发者在Linux环境下快速搭建和使用Redis服务。
2025-12-23 18:42:39
843
原创 Linux C/C++ 学习日记(59):手写死锁监测的组件
本文介绍了多线程环境下的死锁检测机制。死锁是指多个线程因循环等待资源而永久阻塞的状态。作者提出通过构建线程间的有向等待图来检测死锁:当线程请求被占用的锁时建立等待边,获取锁后删除该边,并定期使用拓扑排序检测图中是否存在环。文中给出了C++实现,包含维护互斥锁-线程映射表、构建等待图及检测循环的完整代码。该方案能有效识别典型的循环等待死锁,并通过独立监测线程实时预警。测试案例模拟了四个线程的循环等待场景,验证了检测功能的有效性。
2025-12-21 17:23:49
354
原创 Linux C/C++ 学习日记(58):手写检测内存泄露的组件
本文介绍两种检测内存泄漏的方法:1)宏定义封装法,通过重定义malloc/free记录分配位置信息到文件;2)hook拦截法,使用__builtin_return_address获取调用栈地址。两种方法都会在内存分配时创建文件,释放时删除文件,通过剩余文件定位泄漏点。宏方法简单直接但需修改代码,hook方法更灵活但需处理递归调用问题。文中详细说明了ASLR地址随机化对hook方法的影响及解决方案,并提供了完整的实现代码,包含热更新、线程安全等优化。建议优先使用宏方法,hook方法需编译时加-g参数以便add
2025-12-21 15:46:20
757
原创 Linux C/C++ 学习日记(57):定时器
本文介绍了定时器的实现原理与代码示例。定时器是管理大量延时任务的模块,通过高效的数据结构(如红黑树、最小堆)组织任务,并使用IO多路复用(如epoll_wait)触发机制。文中采用红黑树存储定时任务,利用steady_clock确保时间单调性,通过emplace_hint优化插入效率。代码实现了添加/删除定时任务、检测触发和执行回调等功能,最终演示了结合epoll处理定时任务的完整流程。该方案兼顾了IO事件和定时任务处理,避免了sleep等低效方法。
2025-12-21 00:03:36
745
原创 Linux C/C++ 学习日记(56):用户态网络缓存区
用户态网络缓存区实现方案比较 用户态网络缓存区(发送/接收)用于暂存不完整数据包,支持批量处理。常见实现方案有:1)数组方案存在频繁数据挪移、伸缩性差问题;2)环形队列(ringbuffer)虽优化性能但仍有内存浪费;3)链式缓存区(chainbuffer)通过链表管理离散内存块,具有动态扩容无拷贝、规避大内存分配风险的优势,尤其适合网络编程场景。Linux系统可通过writev/readv合并操作提升环形队列性能。链式缓存区通过小块内存拼接实现高效内存管理,是处理动态长度数据的理想方案。
2025-12-20 21:18:50
502
原创 Linux C/C++ 学习日记(55):原子操作(四):实现无锁队列
本文介绍了无锁队列的设计与实现。首先对比了有锁队列和无锁队列的区别,指出无锁队列通过原子操作实现线程安全,避免了锁带来的性能瓶颈和死锁风险。其次区分了无锁(lock-free)和无等待(wait-free)两种并发级别,并介绍了SPSC、MPSC等不同生产者消费者模式的无锁队列实现。重点分析了SPSC环形缓冲区的设计原理,包括空满判断、读写操作等核心逻辑,并提供了基于原子操作的C++实现代码。同时还讨论了MPSC队列的单链表实现方式,展示了带头节点的队列操作方法。文章通过具体代码示例展示了无锁队列在高并发场
2025-12-20 18:58:30
247
原创 Linux C/C++ 学习日记(54):原子操作(三):精简介绍:CPU缓存、MESI机制、原子变量、volatile、伪共享
本文深入探讨了CPU缓存机制与多线程编程中的核心概念。首先解析了CPU缓存的MESI协议(Modified/Exclusive/Shared/Invalid),解释了缓存行状态转换机制及其对数据可见性的影响。然后详细阐述了多线程编程的三大特性:可见性、顺序性和原子性,指出MESI协议本身不保证即时可见性的原因。接着系统介绍了6种内存序(relaxed/acquire/release/acq_rel/seq_cst)的特性及适用场景,强调应根据具体需求选择合适的内存序。最后通过伪共享案例展示了缓存行对齐的性能
2025-12-20 16:45:21
710
原创 Linux C/C++ 学习日记(53):原子操作(二):实现shared_ptr
本文实现了一个线程安全的shared_ptr智能指针,核心要点包括:1. 采用原子操作管理引用计数,针对不同操作选择合适的内存序:fetch_add使用relaxed、fetch_sub使用acq_rel、use_count使用acquire;2. 实现完整构造函数和运算符(拷贝/移动构造、赋值运算符、解引用等);3. 通过多线程测试验证线程安全性,10个线程各执行1万次拷贝操作后引用计数保持正确;4. 与标准库shared_ptr相比,省略了删除器和弱引用支持,但保证了基础功能正确性。测试案例验证了引用计
2025-12-18 23:08:55
412
原创 Linux C/C++ 学习日记(52):原子操作(一):cpu缓存、可见性、顺序性、内存序、缓存一致性的介绍
本文系统阐述了CPU数据获取机制与多线程同步的核心原理。首先解析了CPU获取数据的层级流程:从L1→L2→L3缓存逐级查询,最终从主存加载。其次重点探讨了线程同步三大特性:原子性(不可中断的操作)、可见性(通过release/acquire内存序强制缓存同步)和顺序性(约束指令重排序)。然后深入分析了缓存一致性协议MESI的工作机制,说明其如何通过状态标记和总线广播保证多核缓存同步,并指出其与原子操作的本质区别。最后通过a++的反例验证了非原子操作的风险,强调原子变量需配合内存序才能确保实时同步。全文揭示了
2025-12-18 00:05:07
889
原创 Linux C/C++ 学习日记(51):内存池
本文摘要: 内存对齐与内存池实现要点 内存对齐核心: 分配指针必须对齐(硬件要求+标准强制) 访问指针需匹配数据类型粒度(x86非对齐性能差,ARM会崩溃) 缓存行对齐(32/64字节)可提升性能 内存池优势: 解决内存碎片问题 提升分配效率(用户态操作) 增强缓存局部性 实现方案: 等长内存池:固定块大小,通过链表管理空闲块 大小块混合池:区分小块(<4KB)和大块(≥4KB) 关键优化:指针地址对齐(MP_ALIGNMENT=32)、内存大小对齐 性能考量: 对齐到缓存行避免跨行读取 通过预分配减
2025-12-17 19:44:16
1021
原创 Linux C/C++ 学习日记(50):连接池
本文介绍了数据库连接池的实现原理与C++代码实现。连接池通过维护固定数量的数据库连接,解决了资源复用和并发处理能力问题。文章详细阐述了同步/异步连接池的区别,并重点分析了异步连接池的组件设计:包括连接池管理类(MySQLConnPool)、连接项(MySQLConn)、工作线程(MySQLWorker)、请求项(SQLOperation)和回调机制(QueryCallback)。通过promise/future实现异步回调,工作线程从任务队列获取请求执行后将结果设置到promise,触发回调函数处理查询结果
2025-12-17 14:58:49
1018
原创 Linux C/C++ 学习日记(49):线程池
本文总结了线程池的核心概念与实现要点:线程池是一种预先创建可复用线程的资源管理机制,通过维护线程集合来避免频繁创建/销毁线程的开销。其核心解决异步执行耗时任务和充分利用多核的问题。实现采用生产者-消费者模型,关键设计包括队列结构(单/双队列、优先级队列等)和线程数量管理(CPU密集型/IO密集型场景下的线程数计算)。代码实现要点涉及互斥锁、条件变量等同步原语的使用,并对比了单队列和双队列设计的性能差异。文章还提供了固定线程池的C++实现示例,涵盖任务提交、线程工作循环和队列管理等核心功能。
2025-12-17 11:42:44
682
原创 C/C++内置库函数(6):C++中类什么时候使用静态变量
C++类中静态变量的核心使用场景包括:全局唯一注册表(如单例模式)、类级常量配置、全局状态统计、静态函数配套存储以及跨对象共享数据。静态变量具有类级别共享、全局生命周期和可被静态函数访问的特性。使用时需注意:非const静态变量必须在类外定义(C++17前),而静态函数仅需类内声明。关键注意事项包括线程安全、初始化顺序、内存泄漏和访问控制。静态变量适用于需要类级共享数据的场景,而非对象专属属性。
2025-12-11 20:22:17
1110
原创 C/C++内置库函数(5):值/引用传递、移动构造、以及常用的构造技巧
文章摘要:本文深入探讨C++引用传递和构造函数的核心机制。引用传递(左值/右值引用)的本质是对象别名绑定,不会创建新对象,因此不会触发构造函数。文章通过代码示例验证了引用传递与值传递的区别,并系统总结了七种企业级常用构造函数模板:包括移动构造、深拷贝构造、委托构造、完美转发构造等。特别强调了单例模式的构造设计原则,提供了饿汉式和懒汉式两种线程安全的单例实现方案。这些模板涵盖了资源管理、泛型编程、继承体系等典型场景,具有重要的工程实践价值。
2025-12-11 18:35:22
971
原创 C/C++内置库函数(4):c++左右值及引用的概念、move/forward的使用
本文深入解析C++中的左值/右值概念及std::move/std::forward的用法。左值有名字可寻址,右值分为纯右值和将亡值;std::move将左值强制转为右值引用以触发移动语义,但不实际移动数据;std::forward实现完美转发,保留参数的原始值类别。文章通过代码示例展示了移动语义的实现原理,并强调移动后源对象处于"有效但未定义"状态,可根据需求决定其具体状态。最后对比了左值引用与右值引用、std::move与std::forward的核心差异及应用场景。
2025-12-11 16:44:12
1271
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅