自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Protobuf使用

假设我们需要对一下结构进行序列化操作+int id;string sex;int age;参考序列化结构,书写proto文件Person.proto 后缀必须是.proto注意消息体名称和结构体名称一样,C++类型和proto类型的不同,每个类型的编号也要不一样生成文件实际上,当我们执行protoc命令之后,就将对应的消息体生成了一个类,类名就是我们消息体(message)的名字,之后通过调用这个类的各种方法(可以打开.pd.cc文件查看),实现数据的序列化的反序列化。

2024-08-28 21:53:44 819

原创 线程同步API

线程的虚唤醒:指的是多个线程阻塞在同一个信号量,当使用notify_all()的时候所有线程都会被唤醒,但大部分线程条件谓词仍不满足,需要继续阻塞,这就是虚唤醒。被唤醒:获取锁,检查条件,不满足条件继续释放锁阻塞。满足条件程序继续执行。注意:wait(mutex,谓词条件)条件不满足:释放锁,阻塞,等待唤醒。条件满足:不阻塞,直接向下执行。

2024-08-04 12:03:35 258

原创 C++四种类型转换

去常转换:const_cast:指针或者引用 去常或者加常静态转换:static_cast:基本类型转换 子转父安全 父转子不安全无类型检查重新解释:reinterpret_cast:任何指针互相转换 不安全动态转换:dynamic_cast:自转父安全 父转子有类型检查父必须有虚方法。

2024-08-03 21:10:51 401

原创 内存管理和进程管理

PCB通过链表的方式组织再一起,组成就绪队列和阻塞队列除了链表的组织方式,还有索引的方式,将同一状态的进程组织再一个索引表中,索引表项指向相应的PCB,不同状态对应不同索引表。

2024-08-02 17:43:26 778

原创 数据结构(面试)

在含有n个带权叶节点的二叉树中,其中带权路径(WPL)最小的二叉树称为哈夫曼树,也称最优二叉树。

2024-08-01 12:59:57 1384

原创 常见算法题思路总结

使用快慢指针,快指针移动k个节点,然后快慢指针同时移动,注意例外情况判断。

2024-07-31 18:48:26 202

原创 C++对象优化

4.静态全局变量编译时分配内存,程序启动时初始化。局部静态全局变量编译时分配了内存,第一次运行到初始化。3.指针引用临时对象出语句会析构(不安全),引用引用临时对象出语句不会析构。用临时对象生成新的对象的时候,临时对象就不产生了,直接构造新对象就可以了。:被调函数返回一个临时对象时,会首先在调用函数栈帧上。3.接收返回值是对象的函数调用的时候,优先。显示生成临时对象 生存周期:所在语句。1.函数传递参数过程中,对象优先。2.当函数返回对象的时候,应该。,而不要返回一个定义过的对象。,不要按赋值的方式接收。

2024-07-27 14:23:47 272

原创 基于CAS操作的atomic原子类型

无锁操作,其实是硬件层面实现总线的加锁操作。对于多线程下的简单类型操作,使用。,对于软件层面是无锁操作。,且临界区代码做的事情。

2024-07-27 10:50:45 146

原创 深入理解new和delete的原理

(1)malloc按字节开辟内存的,new开辟内存时需要指定类型,所以malloc开辟内存返回的都是void*,new直接返回类型指针。(1)对于普通的编译器内置类型,没有构造和析构可言,只涉及内存开辟释放,内存开辟释放底层就是malloc和free,所以可以混用。(2)malloc只负责开辟空间,new不仅有malloc的功能,还可以进行数据的初始化。(2)自定义类型,有析构函数,为了正确调用析构函数,再开辟数组的时候会。(1)delete:先调用析构函数,再释放内存,free只释放内存。

2024-07-20 17:01:26 509

原创 引用和指针的区别

通过引用变量修改所引用内存的值,和通过指针解引用修改指针指向内存的值,其底层指令是一摸一样的。1.右值引用专门用来引用右值类型,指令上,可以自动产生临时量,然后直接引用临时量。4.观察汇编代码发现,引用是将变量的地址存入内存中,所以需求变量必须有地址。3.定义一个引用变量,和定义一个指针变量,其。简单点判断:可以在=左边是左值,否则是右值。3.不能用一个右值引用变量,来引用一个左值。2.引用只有一级引用,没有多级引用。左值:有内存,有名字,值可以修改。,只能用左值引用来引用它。引用是一种更安全的指针。

2024-07-20 09:20:25 317

原创 C++11 容器emplace方法刨析

【代码】C++11 容器emplace方法刨析。

2024-07-19 22:44:50 262

原创 C++模板 底层实现stack 实现vector(空间配置器)

(模板代码调用之前,一定要看到模板定义的地方,这样,模板才能够进行正常的实例化,产生能够被编译器编译的代码,所以一般。注意:模板代码不能在一个文件中定义,在另外一个文件中使用。不是编译器提供的实例化,而是用户提供的实例化。模板的意义:对类型也可以进行参数化。比如下面遍历器的实例化是有问题的。

2024-07-19 18:48:44 297

原创 深入学习STL标准模板库

4.在中间进行insert或者erase,虽然时间复杂度都是O(n),但是vector都是连续空间比较方便,deque的第二维内存空间不是连续的,所以在deque中间进行元素的inset或者erase,指令肯定更多,造成元素移动的时候比vector要慢。2.前中后插入删除元素的时间复杂度:中间O(n),末尾都是O(1), 前插deque O(1) vector O(n)deque特点:动态开辟的二维数组空间,第二维是固定长度的数组空间,扩容的时候(第一维的数组进行2倍扩容)

2024-07-18 22:38:51 899

原创 零拷贝技术

可以发现,mmap+write实现的零拷贝,I/O发生了4次用户空间与内核空间的上下文切换,以及3次数据拷贝。其中3次数据拷贝中,包括了2次DMA拷贝和1次CPU拷贝。sendfile表示在两个文件描述符之间传输数据,它是在操作系统内核中操作的,避免了数据从内核缓冲区和用户缓冲区之间的拷贝操作,因此可以使用它来实现零拷贝。其中3次数据拷贝中,包括了2次DMA拷贝和1次CPU拷贝。4次上下文切换(4次用户态和内核态的切换),4次数据拷贝(两次CPU拷贝以及两次的DMA拷贝)

2024-07-18 17:49:58 837

原创 explicit函数的作用

C++ 类的隐式类型转换是指当一个类定义了适当的构造函数或转换函数时,可以在需要时自动进行类型转换,而无需显式调用转换函数或构造函数。这使得代码更具灵活性和简洁性。1.避免混淆: 隐式类型转换可能会导致代码可读性降低,因此应该避免过度使用,并确保转换行为明确且易于理解。2.显式声明: 如果你想阻止某种类型的隐式转换,可以将转换构造函数声明为explicit,或者禁用类型转换操作符。3.性能影响: 类的隐式类型转换可能会影响性能,因为它可能导致不必要的对象构造和复制。

2024-07-18 16:45:39 318

原创 阻塞和非阻塞 同步和异步

陈硕大神原话:在处理IO的时候,阻塞和非阻塞都是同步,只有使用了特殊的API才是异步IO。

2024-07-13 17:09:47 230

原创 TCP三次握手四次挥手原理

TCP/IP 协议是传输层的一个面向连接的安全可靠的能建立一个安全可靠的连接,那么第一次握手是由客户端发起,客户端会向服务端发送一个报文,在报文里面:SYN标志位置为1,表示发起新的连接。但是对于服务端而言:两次握手是不够的,因为到目前为止,服务端只知道一件事,客户端发给我的消息我能收到,但是我响应给客户端的消息,客户端能不能收到我是不知道的。所以,还需要进行第三次握手,第三次握手就是当客户端收到服务端发送的确认响应报文之后,还要继续去给服务端进行回应,也是一个ACK标志位置1的确认消息。

2024-07-13 10:29:58 711

原创 RSA算法(C++)

RSA为非对称加密算法,由一对公钥和一对私钥构成,私钥加密公钥解密,公钥加密私钥解密。如下图,D为私密的,假设传输英文字母,我们给英文字母编号A=1,B=2,C=3…两对密钥产生方法如下。

2024-07-12 21:05:23 466

原创 函数调用的堆栈过程

【代码】函数调用的堆栈过程。

2024-07-09 14:07:51 171

原创 进程间通信(IPC)

管道是一个特殊的共享文件,属于操作系统(也就不是fork()的复制对象),两个进程通过进行读写通信1.管道的读取属于一次性动作,,普通管道只允许半双工通信,若要实现两个进程双向通信,则需要两个管道2.管道则需要先通过操作系统访问文件再获得内存数据。1.只允许有血缘关系之间的进程通信2.生命周期和进程关联301.可以在两个无亲缘关系的进程间通信2.生命周期独立于进程存在,直到最后一个使用它的进程关闭它或者显示删除该文件3.需要创建文件用于管道通信。

2024-07-08 22:29:38 1067

原创 C++编译链接原理

的段,无。

2024-07-08 21:31:55 856 1

原创 虚拟地址空间划分

指令段,因为局部变量编译之后不会产生符号存入符号表中,只会产生汇编指令(:存放未初始化或初始化为0的数据,操作系统会将数据段.bss部分清零。),只有当运行时,才会在栈上开辟四字节空间存放局部变量的值。每一个进程的用户空间是私有的,内核空间是共享的。:程序搜索头文件和库文件默认的搜索路径。:存放局部变量的值,函数参数和返回值。加载共享库区:用来存放加载的动态库。:空闲区,程序动态分配的内存区域。或许会疑惑,局部变量为什么属于。:存放已初始化且非0的数据。:指令段,存放汇编指令。

2024-07-08 17:46:06 219

原创 主流I/O模型总结(Linux Windows)

【代码】主流I/O模型总结。

2024-07-06 22:41:14 300

原创 ubuntu常用命令

进一步解释:前台进程直接与用户交互,能够接收来自终端的输入,并且通常会阻止终端执行其他命令直到该进程终止。在 ps 输出中看到 + 符号,它标识了当前终端下处于活动交互状态的进程。对于UDP,因为它是无连接的,这一列通常为空或不显示。(进程ID/程序名称): 如果使用了 -p 参数,这一列会显示占用该端口的进程的ID以及可选的进程名称。如果很高,可能表明进程处理数据的速度慢于接收数据的速度。显示连接使用的协议,通常是 “tcp” 或 “udp”。进程的ID,是进程在系统中的唯一标识。

2024-07-06 16:08:33 578

原创 VMware虚拟机配置桥接网络

然后按下图,依次选择2处桥接模式,桥接位置3处选择你的。:VMnet0代表"桥接模式"的虚拟交换机,虚拟主机与真实主机地位完全相同,因此必须给虚拟主机配置相应的IP地址等,当然也可以使用DHCP服务器动态分配IP地址。以win10为例,点击右下角网络和Internet设置-更改适配器选项,找到连接外网的网卡(我的就是下图中2位置的),右键-属性,在WLAN属性中选中。接着选择IPv4页面,如果使用DHCP模式,直接选择DHCP模式,点击应用(如下图),设置即可完成,此时应该大功告成,可以上网啦。

2024-07-06 15:12:15 3333 1

原创 Ubuntu安装redis

以下界面安装成功:当前状况:由于当前端口对应的 ip 127.0.0.1 是环回 IP,只能由当前主机上的客户端访问,跨主机就访问不了实际需求是其它主机也能够访问到,所以需要修改当前端口对应的 ip修改前出现以下界面即可以正常工作。

2024-07-06 11:28:21 334

原创 ubuntu下载Nginx

如果您是通过源码编译的方式安装Nginx,配置文件通常位于Nginx的安装目录下的conf目录中。例如,如果Nginx安装在。打开浏览器访问本机80端口,即访问:http://localhost:80。出现该界面证明nginx启动成功,可以使用nginx进行下一步的配置啦。3.测试nginx是否启动成功。,配置文件路径通常是。

2024-07-06 10:06:56 500

原创 在Linux系统中配置GitHub的SSH公钥

在Linux系统中配置GitHub的SSH公钥,可以让您无需频繁输入密码即可与GitHub仓库进行交互,提高工作效率。首先,检查您的用户目录下的.ssh文件夹中是否已有SSH密钥。如果这些文件已存在,您可以选择直接使用它们。如果需要新密钥,跳到下一步。**添加公钥即可,名称随意。默认的密钥文件可能是。

2024-07-06 09:33:46 502

原创 vscode远程连接linux(配置免密)

1.首先保证物理机和虚拟机网络可以ping通2.查看ubuntu得ip地址ifconfigIP为:192.168.52.1333.连接远程主机。

2024-07-05 23:32:00 230

原创 49. 字母异位词分组

解题思路是:使用map,使用排序好的字符串作为key,源字符串作为value,就可以实现所有字母相同的字符串对应一个key。思路:题目的意思是,将所有字母相同的字符串放到一个数组中。

2024-06-05 22:18:21 282 1

原创 vscode远程连接Ubuntu mysql服务器

注意:刚开始使用root用户死活连接不上,可能就是root用户没有权限的问题,可以尝试创建一个新的数据库用户,授予权限进行连接。

2024-05-26 21:41:55 384

原创 xlib教程

本人学习xlib的知识分享。

2024-05-16 13:22:44 393

原创 git上传项目至github(Linux)

git init创建版本库创建一个版本查看版本记录版本回退一个版本回退二个版本回退到指定版本(版本号上述commit黄色字体)其中HEAD表示当前最新版本,HEAD^表示当前版本的前一个版本,HEAD^^表示当前版本的前前个版本,也可以使用HEAD-1表示当前版本的前一个版本,HEAD-100表示当前版本的前100版本git reflog查看操作记录(前面黄色字体对应版本号):电脑中的目录,上面的git_test/:工作区的隐藏目录.git是git版本库git status:查看当前工作树的状态。

2023-11-08 19:30:39 636

原创 Linux环境下C++配置Json库

1.创建一个json文件夹,使用Xftp将压缩包导入文件夹。3.进入到 jsoncpp-src-0.5.0目录中执行。进入scons-2.1.0目录中执行。下,并为了方便使用,将其重命名为。5、拷贝出Json的静态链接库。目录下的json文件夹拷贝到。4.拷贝出Json的头文件。1、下载Jsoncpp。9 编译链接时 要加。

2023-10-24 10:21:49 514

原创 webserver项目

仅只能访问文件,访问音频视频会出错(怀疑报文文件类型有问题)不能访问目录(未完善)

2023-10-14 11:01:21 362

原创 演讲比赛流程管理系统(C++)

【代码】演讲比赛流程管理系统(C++)

2023-07-20 11:07:08 262

原创 职工管理系统

【代码】职工管理系统。

2023-07-18 09:01:57 221

原创 通讯录管理系统(C++)

【代码】通讯录管理系统(C++)

2023-07-08 13:10:40 308

原创 C++学习笔记

一维数组名用途(sizeof)二维数组名用途(sizeof)

2023-07-06 21:15:33 365

转载 卷积核(kernel)和过滤器(filter)的区别

而过滤器是是由长、宽和深度指定的,是一个三维的概念。卷积核就是由长和宽来指定的,是一个二维的概念。过滤器比卷积核高一个维度——深度。过滤器可以看做是卷积核的集合。

2023-03-25 18:58:56 255 1

空空如也

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

TA关注的人

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