自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(51)
  • 收藏
  • 关注

原创 常见问题及回答2

智能指针是RAII(资源获取即初始化)思想在指针管理上的体现,用于自动管理动态内存,防止内存泄漏。:独占所有权的智能指针。同一时刻只能有一个unique_ptr指向一个对象。当unique_ptr被销毁时,它所管理的对象也会被自动销毁。不支持拷贝,只支持移动。轻量高效,是默认选择。:共享所有权的智能指针。通过引用计数跟踪有多少个shared_ptr指向同一对象。当最后一个shared_ptr被销毁时,对象才会被销毁。支持拷贝和移动。开销比unique_ptr大。:弱引用指针,不增加引用计数。它用于解决。

2025-12-27 13:18:00 639

原创 常见问题及回答1

当对象被销毁后,weak_ptr的lock()返回空shared_ptr,避免了悬空指针。在观察者模式中,观察者用weak_ptr引用主体,即使观察者忘记取消注册,也不会阻止主体被销毁。“从底层看,引用通常由编译器实现为’自动解引用的指针’,但不占用独立存储。实际编程中,函数参数优先用const引用,需要修改参数时用指针或非const引用,需要表示’可选’时用指针(可传nullptr)。最后是链接,把多个目标文件和库文件合并,解决符号引用,生成最终的可执行文件。是编译期常量,有类型安全,有明确作用域。

2025-12-27 13:17:47 605

原创 C++11并发编程

工具核心用途一句话比喻创建和管理线程。雇佣工人。std::mutexlock_guard保护共享数据,防止同时访问。厕所的门锁。线程间等待特定条件成立。餐厅等位叫号器。无锁的简单共享变量操作。不可分割的自动动作。std::async最简单的方式启动异步任务。叫一次性的外卖。在线程间精确传递一次结果。单次使用的快递包裹。将任务打包,便于存储和传递。写好待寄的快递单。

2025-12-26 19:09:08 930

原创 摸鱼ai-

请简单介绍一下你在广东幻方科技有限公司的实习经历。“好的。我在广东幻方科技公司担任C++开发工程师,参与了通信机柜智能门锁系统的后端开发与维护工作,实习期一共14个月。这个系统主要是为数据中心、通信基站等场所提供智能门禁管理。我主要负责三个核心模块:第一是设备通信模块,用C++实现门锁设备与服务器间的TCP通信,包括协议解析和状态同步。第二是本地数据管理,用SQLite存储设备配置和用户权限,提供C++接口供上层调用。第三是配合测试和硬件团队进行联调,修复Bug并编写技术文档。

2025-12-26 18:50:54 523

原创 分布式RPC网络框架

mprpc是一个基于C++开发的轻量级RPC框架,它整合了muduo网络库的高性能I/O模型和Protobuf的高效序列化能力。框架的设计目标是提供简单易用、高性能的远程调用解决方案,支持服务自动注册与发现。核心特性高性能网络通信:基于muduo的Reactor多线程模型高效序列化:使用Protobuf进行二进制数据序列化服务治理:集成Zookeeper实现服务注册与发现配置化:支持配置文件动态加载异步日志:记录框架运行状态在RPC调用中,客户端需告诉服务端三要素服务名:如方法名:如Login。

2025-12-04 11:18:11 823

原创 常见题目及答案

定义内存泄漏是指程序在堆上通过new或malloc分配了内存,但使用完毕后未调用delete或free释放,导致该内存无法被系统回收。长期积累会耗尽可用内存,引发性能下降甚至程序崩溃。避免方法:将资源管理封装在对象生命周期中。使用智能指针(C++11 起)::独占所有权:共享所有权:解决循环引用避免裸newdelete:尽量使用容器(如)或智能指针管理动态内存。“内存泄漏是指堆上分配的内存未被释放,长期积累导致内存耗尽。避免方法包括:使用 RAII 原则、优先用智能指针(如。

2025-12-03 21:58:14 637

原创 线程池设计与实现

线程池通过复用线程减少创建/销毁开销,提升系统性能。设计采用Fixed模式(固定线程数)和Cached模式(动态伸缩)相结合。核心流程包括任务提交、双条件变量协调、信号量同步结果和优雅停机机制,涉及RAII锁、类型擦除等技术。项目曾出现析构死锁和跨平台差异问题,通过gdb分析线程堆栈定位解决。该设计解决了多线程编程的资源竞争、死锁等关键问题,构建了高性能并发基础设施。

2025-12-03 21:46:32 385

原创 ProtoBuf安装

如果使用centOS环境,yum源带的g++最新版本是4.8.5,发布于2015年,年代久远。编译该项目会出现异常。将gcc/g++升级为更高版本可解决问题。

2025-11-19 11:21:47 167

原创 智能指针 (C++)

智能指针通过RAII模式自动管理内存资源,解决了手动内存管理中的野指针、内存泄漏等问题。主要分为三种:unique_ptr实现独占所有权,只能移动不能拷贝;shared_ptr通过引用计数实现共享所有权,适用于容器和资源传递;weak_ptr辅助shared_ptr解决循环引用问题,不增加引用计数。智能指针确保资源在作用域结束时自动释放,有效提升了内存安全性和代码健壮性。

2025-09-29 10:00:24 357

原创 Linux多线程[生产者消费者模型]

本文介绍了信号量机制及其在多线程同步中的应用,重点探讨了生产者消费者模型的实现。首先阐述了信号量的概念,将其比喻为公共自行车亭的资源管理系统,通过P/V操作控制资源访问。随后分析了互斥锁、条件变量和信号量的区别与适用场景。接着详细讲解了生产者消费者模型的特点和优点,包括高效性、灵活性和低耦合性。最后展示了基于环形队列的实现方案,提供了Task任务类和主程序代码示例,演示了多生产者多消费者场景下的线程同步机制。

2025-08-25 19:22:38 890

原创 socket与udp

定义在头文件中,其核心作用是存储 IPv4 协议的地址信息,包括IPport协议族等。在 socket 编程中,很多函数(如bind()connect()recvfrom()等)需要接收一个sockaddr类型的指针作为参数,而是sockaddr针对IPv4的 “具体化” 实现。

2025-08-04 11:31:59 1032

原创 C++11 右值引用与Lambda表达式

传统的C++语法中就有引用的语法,而C++11中新增了的右值引用语法特性,所以从现在开始我们之前学习的引用就叫做左值引用。无论左值引用还是右值引用,都是给对象取别名。那么什么是左值?什么是左值引用?左值是一个表示数据的表达式(如变量名或解引用的指针),我们可以获取它的+可以对它,左值可以出现赋值符号的左边,右值不能出现在赋值符号左边。定义时const修饰符后的左值,不能给他赋值,但是可以取它的地址。左值引用就是给左值的引用,给左值取别名。

2025-07-28 10:45:44 1941

原创 C++11范围for 初始化列表 auto decltype

本文介绍了C++11的几个重要新特性:1) auto自动类型推导,可通过初始化值自动推断变量类型;2) decltype关键字,可直接获取表达式类型用于变量定义;3) 列表初始化{}语法,为内置类型和自定义类型提供统一安全的初始化方式;4) 范围for循环,简化容器遍历操作;5) 智能指针(未展开)。这些特性使C++代码更简洁安全,提升了开发效率,其中列表初始化还能用于STL容器赋值和自定义类构造。

2025-07-25 10:19:30 1013

原创 AVL平衡二叉树

AVL树是一种自平衡二叉搜索树,通过平衡因子(左右子树高度差≤1)确保操作效率为O(log n)。其节点结构包含三叉链(父、左、右指针)、键值对和平衡因子。插入操作分为四步:1)空树直接插入;2)搜索位置;3)链接新节点;4)平衡调整(更新平衡因子并旋转)。旋转分为四种情况:左单旋(右子树过深)、右单旋(左子树过深)、左右双旋和右左双旋。代码实现时需注意空指针检查和根节点更新。AVL树通过严格平衡保证高效查找,适用于需要频繁查询的场景。

2025-07-11 16:55:50 688 2

原创 Linux线程同步/互斥

本文主要探讨了多线程编程中的资源共享问题及解决方案。当多个线程并发访问共享变量(如计数器)时,由于非原子操作和指令交错,可能导致数据不一致(如预期结果200000,实际小于该值)。通过引入临界区、互斥锁等机制,可以确保线程安全访问。互斥锁通过原子性操作实现资源保护,但会带来性能损耗,因此需控制加锁粒度。文章还分析了线程切换时机,并提供了互斥锁的API使用方法及封装示例,强调合理使用锁机制对多线程程序稳定性的重要性。

2025-07-09 17:42:20 1004

原创 Linux线程控制

由于用户并不会直接使用轻量级进程的接口,于是 需要借助第三方库进行封装,类似于用户可能不了解系统提供的 文件接口,从而方便使用。当程序运行时,原生线程库需要从磁盘加载至内存中,再通过进程地址空间映射至共享区中供线程使用。可以看到五个线程打印“同一个”临时变量的地址并不相同,足以证明线程独立栈的存在。线程之间共享全局变量,对全局变量进行操作时,会影响其他线程。修饰,修饰之后,全局变量不再存储至全局数据区,而且存储至线程的局部存储区中。的起始地址就表示当前线程的 ID,地址是唯一的,因此线程。

2025-07-08 18:10:18 1344

原创 mysql索引

文章摘要 索引是提高数据库查询效率的关键机制,通过空间换时间的方式优化数据检索。本文系统介绍了索引的基础概念、工作原理及实现方式: 索引本质:类似书籍目录,通过预排序和存储关键信息,使数据库无需全表扫描即可快速定位数据。 索引必要性:数据量越大,索引价值越显著,百万级数据查询性能可提升数十倍。 索引类型:包括普通索引、唯一索引、主键索引和联合索引等,各有适用场景。 底层实现:基于磁盘存储特性(扇区/柱面)和I/O优化(16KB页大小),通过B+树结构组织数据页和目录页,实现高效查找。 B+树原理:多级目录页

2025-07-07 17:08:16 1393 2

原创 二叉排序树

本文介绍了二叉排序树的基本性质和操作实现。二叉排序树具有以下特性:左子树节点值小于根节点,右子树节点值大于根节点,左右子树也均为二叉排序树。其平均时间复杂度为O(log n),最坏情况为O(n)。文章详细讲解了二叉排序树的数据结构设计,包括节点结构和树结构,并提供了三种核心操作的实现方法:查找操作采用遍历比较方式;插入操作需处理空树和值比较情况;删除操作最为复杂,需区分叶子节点、单子节点和双子节点三种情况,其中双子节点删除时需找到右子树最小节点进行替换。各操作均配有代码实现和详细注释。

2025-06-30 20:07:16 444

原创 mysql表操作与查询

本文介绍了SQL中表的基本操作和查询语句。主要内容包括:1) 表的创建、修改、复制等操作,重点讲解了CREATE TABLE语法、数据类型、列约束和表约束;2) 基础查询操作,详细说明了SELECT语句的执行顺序及各子句的用法,包括选择列、表连接、WHERE条件筛选(比较运算符、逻辑运算符、范围查询、NULL判断、模糊查询等)。文章通过具体代码示例演示了各类SQL操作,为数据库初学者提供了实用的参考指南。

2025-06-27 20:09:35 1307

原创 C++多态

本文系统介绍了C++中的多态特性。多态是指同一操作作用于不同对象产生不同行为,其核心在于接口与实现分离、可扩展性和代码复用。在C++中主要通过虚函数重写和继承实现多态,需满足基类指针/引用调用虚函数且子类重写虚函数两个条件。文章详细讲解了虚函数、虚函数重写(含协变和虚析构函数)、final/override关键字、重载/重写/重定义的区别、抽象类概念,并深入分析了多态的实现原理(虚函数表和虚函数指针)。这些机制共同构成了C++运行时多态的基础,使程序具有更好的灵活性和可维护性。

2025-06-21 22:51:34 1048

原创 C++继承

C++继承机制解析 继承是C++面向对象编程的核心特性,实现了代码复用和多态基础。通过继承,子类自动获得父类能力并发展自身特性,但无法访问父类私有成员。继承方式包括public、protected和private,影响成员的可见性,其中public继承最常用。子类与父类存在赋值兼容规则,允许子类对象赋值给父类,但反向操作需强制类型转换。继承中同名成员会隐藏父类成员,可通过作用域运算符访问。构造函数调用遵循基类到子类的顺序,析构则相反。菱形继承会导致数据冗余和二义性,可通过虚继承解决。虚继承使用指针存储偏移量

2025-06-20 21:09:40 1369

原创 list使用及模拟

list是支持常数时间内任意位置插入删除的序列容器,具备双向迭代能力。其底层为双向链表结构,各元素存于独立节点,通过指针指向前后元素。与forward_list的主要区别:后者是单链表,仅支持单向迭代,结构更简单高效。相比array、vector、deque等序列容器,list在任意位置插入/删除元素的效率更优。缺陷:不支持随机访问(如访问第6个元素需线性迭代),且因节点存储额外信息,对存储小元素的大列表可能更占空间。

2025-06-13 20:33:37 796

原创 vector使用及模拟

可变数组容器vector是动态数组,支持随机访问,大小可自动扩展连续存储:与数组一样使用连续内存,下标访问高效,但支持动态扩容动态扩容机制:插入新元素时可能重新分配更大的数组,将原元素迁移至新数组,避免频繁扩容空间分配策略:分配额外空间应对增长,扩容间隔按对数增长,确保尾部插入操作的时间复杂度为 O (1)空间换时间:通过预分配冗余空间减少扩容次数,以额外内存开销换取高效动态增长性能特性:随机访问效率极高,尾部插入 / 删除高效,中间操作效率较低;迭代器和引用稳定性优于list。

2025-06-07 15:23:19 1119

原创 Linux线程初识

在一个程序里的一个执行路线就叫做线程(thread更准确的定义是:线程是“一个进程内部的控制序列”一切进程至少都有一个执行线程线程在进程内部运行,本质是在进程地址空间内运行在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流。

2025-06-05 22:04:04 882

原创 Linux进程信号

生活中的信号类比(交通信号灯、警报),当产生这些信号时,我们会立马想到对应的动作。在Linux中,信号是事件发生对进程的通知机制亦称软件中断,由操作系统内核、进程本身或者其他进程向目标进程异步事件发送机制(即收到某种信号,并不会立马去执行)。pending集是信号产生后的暂存区,block是控制信号是否能从pending暂存区递交给进程的开关。信号产生后会稍后递达给某进程,信号在产生和到达期间会一直处于pending等待状态。信号,内核向进程通知且递送一次,(编号34-64)为。位为1生效,0不生效。

2025-06-01 18:06:19 1975

原创 共享内存-systemV

共享内存是一个允许多个进程直接访问同一块物理内存区域的进程通信工具,因其本身不涉及用户态与核心态之间转换,故效率最佳。写入数据 (e.g., sprintf(shm_ptr1, "Hello"))读取数据 (e.g., printf("%s", shm_ptr2)):成功返回共享内存的起始地址指针,失败返回。:用于存储或修改共享内存属性的结构体(返回内存指针 shm_ptr1。**返回值:**蔡成功返回一个。:成功返回0,失败返回 -1`:成功返回共享内存标识符。:成功返回0,失败返回。

2025-05-31 14:31:34 1030

原创 String类使用及模拟

介绍了C++中string类的基本概念、构造函数和析构函数的使用方法,并通过示例代码演示了多种构造方式。重点讲解了string类的拷贝构造和赋值运算符重载的模拟实现,分析了浅拷贝带来的问题及解决方法。此外,还详细展示了如何实现operator[]操作符重载,确保对字符串元素的正确访问。文章通过代码示例和图示帮助理解string类的底层实现原理和使用技巧。

2025-05-27 20:22:16 1787

原创 进程通信(匿名管道+命名管道)

进程通信工具分为数据传输工具和共享内存两类。这里我们讨论进程通信工具(IPC)里面的管道、system V和共享内存。在理解阶层通信之间,我们先了解用户空间缓冲区和内核空间缓冲区两个概念。

2025-05-26 23:22:19 1688

原创 Linux--初识文件系统fd

本文主要介绍了Linux文件系统中的关键概念和操作,包括C/系统调用文件操作、ext2文件系统结构、超级块、块组描述符表、位示图、文件描述符、重定向、inode、数据块、缓冲区以及软硬链接。ext2文件系统通过块组管理文件,超级块和块组描述符表提供文件系统的元数据,位示图记录inode和块的分配状态。文件描述符用于标识和访问已打开的文件,inode存储文件的元数据,数据块存储文件的实际内容。缓冲区用于提高数据读写效率,分为全缓冲、行缓冲和无缓冲。软硬链接的区别在于软链接创建新的inode,而硬链接则共享同一

2025-05-23 20:02:32 1386

原创 模板(template)初识

如果模板函数和非模板函数都存在且相同情况下,优先调用非模板函数,而不是调用模板函数实例化的函数(优先选择更快的方式)在编译器编译阶段,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用,无须手动干预自动完成。非模板函数可以和同名的函数模板同时存在,且该函数模板还可以被实例化为这个非模板函数。编译器在代码中遇到模板使用时自动生成对应的实例,无需手动声明。用不同类型的参数使用函数模板时,称为函数模板的实例化。类模板名字不是真正的类,而实例化的结果才是真正的类。手动指定生成特定类型的模板函数。

2025-05-19 21:15:39 335

原创 C++内存管理

二者为全局函数,new和delete在底层分别调用operator new和operator delete全局函数来申请空间。动态内存分配:指在程序运行时,根据需求在堆空间申请和释放一段连续的地址空间(频繁分配/释放导致内存不连续),且需手动计算字节数。申请空间成功就直接返回,否则执行用户提供的空间不足应对措施,如果用户提供该措施就继续申请,否则就抛异常。操作符,申请和释放连续的空间,使用。申请和释放单个元素的空间,使用。申请和释放的是单个元素的空间,如果申请的是内置类型的空间,申请的是连续空间,而且。

2025-05-19 08:45:21 789

原创 printf函数参数与入栈顺序

C标准未规定参数求值顺序。大多数编译(GCC、Clang)默认从右往左入栈顺序,这样可以支持…表示向右对齐占m列,左边不足补空格,输出字符只占n位,超出n位删去。调用printf("Value: %d", 42)无`\0`满足条件时刷新(如缓冲区满、遇到\n)不同编译器可能出现不同的结果。,支持多种数据类型和格式控制。显示"Value: 42"格式化字符串并写入缓冲区。

2025-05-18 21:47:49 1183

原创 C语言标准I/O与Linux系统调用的文件操作

打开文件 → 读写操作 → 关闭文件。

2025-05-18 18:42:00 2313

原创 Linux下可执行程序的生成和运行详解(编译链接汇编图解)

首先,程序从高级语言到可执行文件经历了预处理、编译、汇编和链接四个步骤,其中链接阶段涉及动态库和静态库的使用。接着,文章解释了操作系统如何通过fork创建子进程,并通过execve系统调用加载ELF文件,替换进程地址空间并执行程序。最后,程序从_start入口跳转到main函数执行。整个过程通过COW(写时复制)技术优化了内存使用,确保子进程的失败不会影响父进程。

2025-05-16 15:25:34 1611

原创 双向循环连表C语言实现

【代码】双向循环连表C语言实现。

2025-05-14 21:53:11 224

原创 单向循环链表C语言实现实现(全)

【代码】单向循环链表实现(全)

2025-05-14 21:44:54 382

原创 C++类和对象--收尾

初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。静态变量存储在静态存储区,其初始值默认为0属于这个类的所有对象,也属于这个类(初始化一次)。友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在。友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。如果C是B的友元, B是A的友元,则不能说明C时A的友元。指针不能访问非静态的成员(成员变量+成员函数)类的私有成员变量,但想在。

2025-05-14 19:58:28 891

原创 C/C++关键字(sizeof(含内存对齐),typedef,static,const,inline)

sizeof()是 C/C++ 中的一个运算符(不是函数),获取对象或类型以字节为单位的内存大小。它在求值,不会产生运行时开销。sizeof\0sizeof()首先这个联合体的大小得看其中最大成员结构的内存大小,结构体u的大小为12字节,而k是4字节,这个联合体一共是12字节。x和k的内存空间是同一块,k赋值为0后,通过x去访问,它的值还是0。

2025-05-13 11:40:12 1858

原创 C++类和对象--中阶

在 C++ 中,类有(不是 6 个构造函数),它们会在特定情况下由编译器自动生成。包括构造函数,析构函数,拷贝构造和赋值运算符重载,取地址和const取地址重载。简而言之就是,用户没显式实现,编译器会生成的成员函数。

2025-05-12 22:47:48 1700

原创 Linux环境下安装MySQL

在Linux环境下安装MySQL的步骤包括:首先检查并卸载系统默认安装的MySQL或MariaDB相关包,确保系统干净。接着,根据系统版本从MySQL官方网站获取匹配的yum源,并将其下载到指定目录。然后,通过yum命令安装MySQL服务,并检查安装是否成功。安装完成后,可以通过查看临时密码或使用skip-grant-tables命令登录MySQL。最后,启动MySQL服务,确保数据库可以正常使用。整个过程建议在root用户下进行,以便快速适应和操作。

2025-05-12 16:48:39 660

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除