自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Effective C++ 剖析(条款10~22)

1.自己new的对象自己释放不要指望调用这个函数的人帮你释放;2.不要尝试以某一个Copying函数去实现另一个Copying函数,可以把相同的逻辑放在一个单独的函数中,Copying函数再去调用这个函数。防止用户不小心自我赋值或者不排除有这种需求,必须排除自我赋值可能带来的问题,下面演示一种可能会出现的问题。11.你的新type有多么一般化(考虑设计为模板类)?8.什么样的标准函数(系统自带的函数)应该被驳回?7.什么样的操作符和函数对新type是合理的?6.你的新type需要什么样的类型转换?

2025-03-29 18:59:58 493

原创 Effective C++ 剖析(条款1~9)

1. C语言:如内置数据类型,数组,指针等。2. Object-Oriented C++(面向对象C++):如 class,封装,继承,多态,动态绑定等。3. 泛型编程。4. STL。

2025-03-17 21:54:22 418

原创 etcd 基于 etcd-cpp-apiv3 封装服务注册,发现客户端

Etcd 是一个 golang 编写的分布式、高可用的一致性键值存储系统,用于配置共享和服务发现等。它使用 Raft 一致性算法来保持集群数据的一致性,且客户端通过长连接watch 功能,能够及时收到数据变化通知。

2025-03-04 21:43:22 588

原创 RPC 框架项目剖析

本文用于梳理一个 rpc项目的实现细节,此项目基于cpp语言 大概三千行左右,用于学习目的。

2025-02-23 22:43:28 794

原创 MySQL 日志

⼆进制⽇志包含数据库更改的"事件",不会记录 SELECT 和 SHOW ,例如:记录表的创建操作或。Undo Log保存了数据的多个版本,事务可以根据隔离级别读取适当的版本,而不是总是最新的数据。Redo Log记录了对数据库所做的物理修改操作,这些修改操作是在事务执行过程中产生的。表数据的更改,⼆进制⽇志还包含每个语句更新数据时花费的时间信息,启动⼆进制⽇志,对服务。中记录的事件在从节点上执⾏相同的操作,保证主从节点服务器上数据⼀致,实现数据复制功。DDL操作用于管理、维护和修改数据库对象的结构,

2025-02-18 22:59:01 864

原创 MySQL 事务及MVCC机制详解

事务就是一组DML语句组成,这些语句在逻辑上存在相关性,这一组DML语句要么全部成功,要么全部失败,是一个整体。MySQL提供一种机制,保证我们达到这样的效果。事务还规定不同的客户端看到的数据是不相同的。原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。

2025-01-20 11:34:24 1240

原创 MySQL 索引机制原理

在创建表时可以为某些合适的字段添加索引,它可以在查询数据时提高效率。

2025-01-18 11:13:26 657

原创 Linux select poll epoll 介绍(附Reactor代码)

select工作原理用户通过select将要关心的文件描述符告诉操作系统,由操作系统帮我们检测是否有文件描述符就绪,然后返回给用户。兼容性好,即使是较老的Linux版本也支持(出来的早)1.每次调用select, 都需要手动设置fd集合, 从接口使用角度来说也非常不便.2.每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大3.同时每次调用select都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很大4.select支持的文件描述符数量有限制。

2025-01-13 20:13:47 483

原创 Linux socket套接字编程(TCP)

/ 创建 socket 文件描述符 (TCP/UDP, 客户端 + 服务器)// 绑定端口号 (TCP/UDP, 服务器)// 开始监听socket (TCP, 服务器)// 接收请求 (TCP, 服务器)// 建立连接 (TCP, 客户端)

2025-01-06 20:49:08 599

原创 Linux 多线程(理论+实践)

1. Linux下的线程概念Linux 线程是 Linux 操作系统中实现多线程编程的一种机制。在 Linux 中,线程被视为轻量级的进程,它们共享同一个进程的地址空间和其他资源(如文件描述符、信号处理程序等),但每个线程都有自己的线程上下文(包括线程ID、栈空间、程序计数器等),以及独立的调度优先级和状态。Linux设计者认为进程和线程都是执行流具有极高的相似度,因此没有必要单独设计一套数据结构和算法,直接复用进程代码。因此搞懂了Linux进程,线程也就容易了。进程相关知识在有多线程技术

2025-01-03 22:08:39 1140

原创 Linux 信号(结合系统理解)

信号是进程之间事件异步通知的一种方式,属于软中断。

2025-01-01 15:27:26 1095

原创 【Linux】 进程池 一主多从 管道通信

本文代码采用一主多从式(一个主进程(master)多个子进程(worker))通过管道进行通信,实现主进程分发任务,子进程完成任务,当主进程关闭管道时,子进程执行完任务后退出。

2024-12-06 20:42:26 412

原创 【Linux】进程地址空间(虚拟地址vs物理地址vs页表)

了解虚拟内存,物理内存等概念

2024-12-01 22:25:19 947

原创 Linux 进程调度-O(1)算法

所以无论从进程调度的效率方面来考虑还是进程调度的公平性Linux进程调度算法都相当优秀。

2024-11-30 22:06:27 505

原创 【Linux】 进程是什么

1.操作系统为了更好的管理我们的软硬件,抽象出了许多概念,其中比较有代表的就是进程了。通俗的来说操作系统为了更好的管理加载到内存的程序,故引入进程的概念。2.在操作系统学科中用PCB(描述进程。PCB是宏观的概念,不同的操作系统具体实现不同。例如Linux中的PCB叫做task_struct。3.task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。

2024-11-28 22:34:55 991

原创 Vim 常用操作和使用技巧

vim常用的三种模式分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能区分如下:正常/普通/命令模式(Normal mode)控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode插入模式(Insert mode)只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。该模式是我们后面用的最频繁的编辑模式。

2024-11-26 20:46:23 648

原创 Linux 命令总结

一些Linux常用命令

2024-11-24 21:31:08 741

原创 cpp 内存高级话题(从new delete 谈到 内存池 再到 嵌入式指针)

1. new和delete是运算符不是函数。2.c++中使用new和delete从堆中分配和释放内存,两者成对使用。3.使用方式:指针变量名 = new 类型标识符;指针变量名 = new 类型标识符(初始值);指针变量名 = new 类型标识符【内存单元个数】1.1 new做了什么事operator new,delete后续会介绍。

2024-11-23 22:28:01 719

原创 cmake 使用教程(快速上手)

CMake 是一个开源、跨平台的构建系统,主要用于软件的构建、测试和打包。CMake 使用平台无关的配置文件 CMakeLists.txt 来控制软件的编译过程,并生成适用于不同编译器环境的项目文件。

2024-10-22 22:38:23 2221

原创 Docker 镜像制作(Dockerfile)

Dockerfile 是什么?镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,这个脚本就是 Dockerfile。Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction), 每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。为什么需要 Dockerfile?可以按照需求自定义镜像。

2024-09-17 20:49:15 1484 2

原创 Docker 常用命令

功能列出本地镜像。关键参数-a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);--digests :显示镜像的摘要信息;-f :显示满足条件的镜像;--format :指定返回值的模板文件;--no-trunc :显示完整的镜像信息;-q :只显示镜像 ID。

2024-09-13 20:36:21 1414

原创 Git 学习与使用

⼯作区:是在电脑上你要写代码或⽂件的⽬录。暂存区:英⽂叫stage或index。⼀般存放在.git ⽬录下的index⽂件(.git/index)中,我们把暂存区有时也叫作索引(index)。版本库:⼜名仓库,英⽂名 repository。⼯作区有⼀个隐藏⽬录.git ,它不算⼯作区,⽽是Git的版本库。这个版本库⾥⾯的所有⽂件都可以被Git管理起来,每个⽂件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

2024-09-06 09:32:51 737

原创 protobuf 入门学习

在安装protobuf时会使用到一些依赖库,如果没有安装就先执行下面的命令centos下根据自己的语言下载或者选择all.zip支持全部语言进入到下载的目录下# 第⼀步执⾏autogen.sh,但如果下载的是具体的某⼀⻔语⾔,不需要执⾏这⼀步。# 第⼆步执⾏configure,有两种执⾏⽅式,任选其⼀即可,如下:# 1、protobuf默认安装在 /usr/local ⽬录,lib、bin都是分散的# 2、修改安装⽬录,统⼀安装在/usr/local/protobuf下。

2024-08-28 10:27:57 202

原创 红黑树原理 部分模拟实现

enum colorRED,BLACK//父节点指针//节点的值域color _col;//颜色_kv(kv),_col(RED) //初始颜色为红色{}

2024-06-28 10:37:23 858

原创 AVL树原理 部分模拟实现

int _bf;//平衡因子_bf(0),_kv(kv){}

2024-06-27 11:37:33 948

原创 C++ 模板高阶

【优点】1. 模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生2. 增强了代码的灵活性【缺陷】1. 模板会导致代码膨胀问题,也会导致编译时间变长2. 出现模板编译错误时,错误信息非常凌乱,不易定位错误。

2024-06-23 21:00:13 604

原创 CPP-类对象大小的组成

实际上由于同一个类的每个对象中只有变量不一样,而函数代码都是一样的,所以没有必要每个对象都存一份函数代码。4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。要计算一个类对象的大小要先明白一个问题:类中既可以有成员变量,又可以有成员函数,那么一个类的对象中包含了什么?3. 结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。

2024-06-23 18:51:27 264

原创 C++ 右值引用

什么是左值?什么是左值引用?左值是一个表示数据的表达式(如变量名或解引用的指针),我们可以获取它的地址+可以对它赋值,左值可以出现赋值符号的左边,右值不能出现在赋值符号左边。定义时const修饰符后的左值,不能给他赋值,但是可以取它的地址。左值引用就是给左值的引用,给左值取别名。什么是右值?什么是右值引用?右值也是一个表示数据的表达式,如:字面常量、表达式返回值,函数返回值(这个不能是左值引用返回)等等,右值可以出现在赋值符号的右边,但是不能出现出现在赋值符号的左边,右值不能取地址。

2024-04-21 11:35:21 314

原创 C++ 深入理解 多态

多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。在继承中要构成多态还有两个条件:1. 必须通过基类的指针或者引用调用虚函数。2. 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。虚函数的重写(覆盖):派生类中有一个跟基类完全相同的虚函数(即派生类虚函数与基类虚函数的返回值类型、函数名字、参数列表完全相同),称子类的虚函数重写了基类的虚函数。虚函数重写的两个例外:1. 协变(基类与派生类虚函数返回值类型不同)

2024-04-21 10:28:16 979 1

原创 C++ 深入理解 继承

本篇文章将谈谈一下几个问题:1.基类和派生类对象赋值转换2.继承中的作用域3.派生类的默认成员函数4.复杂的菱形继承及菱形虚拟继承5.其他。

2024-04-20 23:08:32 621

原创 Linux 共享内存 及 利用管道实现简单协同

第二部要创建共享内存,参数分别是key(上边ftok生成的key)size(共享内存的大小,推荐4KB)第三个参数是打开方式(如果你是创建就IPC_CREAT | IPC_EXCL,如果你是打开共享内存就IPC_CREAT)。第三部关联共享内存(第一个参数传入shmget的反回值,第二个参数传nullptr表示系统帮你选择一块地址空间,第三个参数传0表示默认以读写方式打开,返回值是这块空间的起始地址,默认大小是shmget传的size)这些共享的内存区域可以被多个进程访问,从而实现对进程间数据的快速交换。

2024-04-20 17:56:01 727

原创 cpp智能指针详解+简单模拟实现

有多个指针指向同一分内存时就要考虑使用shared_ptr了,shared_ptr的本质是采用引用计数的方式来记录有多少个指针指向这份空间,当发生拷贝或赋值时引用计数就++,shared_ptr析构时引用计数就--,只用当引用计数为0时才会释放空间。unique_ptr不允许复制和拷贝(可以移动构造和移动赋值)本质上就是一个unique_ptr管理一个内存空间(如果是多个指针指向同一份内存要用后面的shared_ptr)。由于它的构造和析构不会引起引用记数的增加或减少所以完美解决了循环引用的问题。

2024-04-18 11:42:57 313 1

原创 c++代码模拟实现qt对象树机制

object对象最先调用析构函数,遍历其容器,deleteA对象然后A对象调用其析构函数,遍历到B对象然后B对象调用其析构函数无对象在其容器自此所有对象全部被释放。在qt中当父对象被销毁时,它会自动销毁所有子对象。下面我将用代码简单模拟一下对象树的原理。注意:虽然A对象先调用析构函数但是实际上A对象要等到B对象的生命周期结束之后A对象的生命周期才算结束。我们发现此时在A对象中new出来的B对象并没有被释放,导致内存泄漏了。下面我将对刚才的代码进行一部分的修改。上,这样便形成了一颗简单的对象树。

2024-01-06 11:40:38 434 3

原创 C++引用(起别名)

以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效率是非常低下的,尤其是当参数或者返回值类型非常大时,效率就更低。所以引用做函数参数时没有临时拷贝可以提高效率。其实在底层上来说引用是按照指针方式来实现的。但是sizeof(引用)的大小是引用类型的大小而sizeof(指针)的大小是4/8个字节。而且不存在二级引用的说法。

2023-10-16 14:22:49 379 5

原创 不用+号算加法(位运算实现)

在不能使用 + 号的情况下其实很容易想到运用位运算去解决问题,也就是用二进制去表示十进制加法的逻辑。所以我们可以先拆分十进制加法来帮助理解。最近在LeetCode上刷题看到一道非常有意思的题,如何不用+号算加法?我觉得挺有意思的故而分享给大家。(因为 5+7 的不考虑进位的结果是 2 ,遇 10 进位),然后计算进位 5+7。,则 10 与 12 再次相加,得到 22 ,进位为 0 ,则计算到此结束。十进制相加思想:例如 15+07 , 先计算不考虑进位的。当进位为0时结束计算。

2023-08-18 10:12:03 475 26

原创 C语言 与 C++ 通讯录对比实现(附源码)

在C++版里我们总共用的新的概念有:类,vector,运算符重载,范围for循环,迭代器,内联函数等等。C++源码:test.cpp// 菜单//枚举选项Exit,add,del,Search,modify,Sort,Printint main()int input;do {menu();cout

2023-07-17 11:49:26 513 29

原创 C++ 继承与多态的基本用法

所谓动态其实就是在程序运行的时候(运行到调用fun函数这行代码时)才能知道调用的是哪个子类的fun函数,虚函数因为是在程序运行的时候才知道调用的是哪个虚函数,所以虚函数必须写它的定义部分(以备编译器随时调用)。在C++继承中,子类会遮蔽父类中的同名函数,无论此函数的返回值,参数。也就是说父类和子类中的函数只要名字相同,子类中的函数就会遮蔽掉父类中的同名函数。通过继承父类中有很多成员变量和成员函数就自动继承到了子类中,那么在书写子类的时候就减少了很多代码工作量——只用写子类独有的一些内容即可。

2023-07-14 10:33:28 238 17

原创 C++析构函数与深,浅拷贝

被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。即对象的浅拷贝会对“主”对象进行拷贝,但不会复制主对象里面的对象。简而言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象。因为我们拷贝的对象与原对象动态开辟的元素共用了一段内存。深拷贝是一个整个独立的对象拷贝,深拷贝会拷贝所有的属性,并拷贝属性指向的动态分配的内存。析构函数与构造函数是相对的,或者说是相反的,定义对象时系统会调用构造函数,对象销毁时系统会调用析构函数。

2023-07-13 19:41:47 244 8

原创 C语言—模拟实现memcpy,memmove

和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。如果源空间和目标空间出现重叠,就得使用memmove函数处理。//前->后else//后->前return ret;注意当dest

2023-07-12 12:55:02 651 11

原创 C++构造函数与拷贝构造函数

在类中有一种特殊的成员函数,它的名字与类名相同,在创建类对象时,这个特殊的成员函数会被系统自动调用,这个函数就叫拷贝构造函数。可以简单理解为构造函数的意义就是初始化类内对象的成员变量。注意构造函数无返回值,一个类中允许多个构造函数的存在。虽然一个类中允许多个构造函数的存在但是要让编译器区分不同构造函数的区别,否则会报错。上面的代码就不允许同时存在。上面代码其实调用的是拷贝构造函数。下面马上来讲解拷贝构造函数。

2023-07-12 11:12:06 316 4

空空如也

空空如也

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

TA关注的人

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