自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 gRPC常见面试题目

(2)实现负载均衡逻辑:实现 grpc::LoadBalancer 接口中的 UpdateSubchannels 和 RequestReresolution 方法,以及 grpc::Subchannel 接口的 ConnectivityStateWatcherInterface 回调。(1)定义负载均衡器接口:实现 grpc::LoadBalancer 接口,包括 grpc::OrphanablePtr<LoadBalancer> 的 CreateLoadBalancer 方法。

2024-07-29 00:58:06 515

原创 C++语言相关的常见面试题目(三)

在双向循环链表的实现中,这个空节点同时作为头节点和尾节点的前驱和后继,使得链表形成一个闭环。(1) 模拟指针操作:通过类对象模拟指针行为,重载解引用和递增/递减操作符,实现对容器元素的访问与遍历。(3)与容器互动:依赖容器实现间接访问元素,不直接管理内存,需考虑容器变化导致的迭代器失效问题。迭代器:当前正在遍历的元素、当前连续空间的首尾地址,还有指向当前空间的指针(存储在指针数组中)迭代器的定义:实现了一种访问容器内元素但是不会暴露容器内部实现的方式。前驱指针:指向链表中当前节点之前的一个节点。

2024-07-29 00:42:39 181

原创 leetcode每日一题-3033. 修改矩阵

其实还可以进一步优化。官方题解对数据进行了两次遍历,有没有办法进行一次遍历呢?事实上可以把每一列的最大值和-1的元素坐标先保存下来,然后再把元素坐标替换为相应列的最大值即可。解题思路:简单题目,思路非常直接。对列进行遍历,记录下最大值,然后再遍历一遍,把-1替换为最大值。需要注意的是进行列遍历和行遍历是不同的。学C/C++就找挨踢零声,加入挨踢零声,面试不挨踢!这样只需要遍历一次数据就可以了。这是一条吃饭博客,由。

2024-07-29 00:42:07 225

原创 leetcode每日一题-3101 交替子数组计数

假设现在有一个队列0101.....1,队列以元素1结尾说明那么当我们新加入一个元素队列元素总和变了,说明是元素值是1,鉴定重复,元素总和没变说明是0,就是不重复的。[0,1, 0, 1, 0], 满足条件, count+=5, count = 10。[0,1, 0, 1], 满足条件, count+=4, count = 10。[0,1, 0], 满足条件, count+=3, count = 6。举个实际的例子,[0, 1, 0, 1, 0]。

2024-07-29 00:40:28 189

原创 SRS流媒体服务器概述

翻译:SRS/5.0(Bee)是一款简洁、高效、实时的视频服务器,支持RTMP、WebRTC、HLS、HTTP-FLV、SRT、MPEG-DASH、GB28181。kernel:包含了 SRS 服务器的核心功能和基础设施代码,用于支持各种协议的实现和服务器的基本运行。libs:包含了 SRS 服务器的一些基础库和第三方库的代码,用于支持服务器的各种功能和扩展。core:包含了 SRS 服务器的核心功能和基础设施代码,用于支持应用层代码的运行和管理。学C/C++就找挨踢零声,加入挨踢零声,面试不挨踢!

2024-07-29 00:39:40 196

原创 C++语言相关的常见面试题目(二)

添加新元素时,如果当前容量不足以容纳新元素,就需要重新分配更大的内存空间,并将原始数据拷贝到新地址上去。有两个重要的成员变量:容量(capacity)和大小(size)。容量指向当前已分配内存空间的大小,而大小则表示当前。引用是别名,不是对象,没有实际地址,不能定义引用的指针,也不能定义引用的引用。对象时,会分配一块初始大小的连续内存空间来存储元素。省流:内存只增加不减少,gcc每次增长会翻倍,vs会增加0.5倍。元素访问:通过使用指针进行偏移来访问数组中的元素。2. vector的内存增长机制。

2024-07-29 00:37:55 93

原创 FFmpeg开发环境搭建

FFmpeg是音视频开发必备的库,也是唯一的库。本文主要讲解在ubuntu22和macOS14环境下的编译安装。为什么要自己编译呢?其中一个很重要的原因就是ffmpeg在编译时可以加入很多插件,这种特定的库网络上可能找不到编译好的版本,另外如果需要在ffmpeg基础上进行二次开发,也需要进行手动编译。对于新手只推荐在Linux/macOS上进行编译。经过本人的测试ffmpeg4/5/6都能在这两个系统上轻松搞定,但是windows上编译非常困难。

2024-07-29 00:35:53 266

原创 C++面向对象的常见面试题目(二)

右值引用的意义:避免资源的复制,实现资源所有权的转移,在模板编程中,右值引用和模板参数的结合使用可以实现完美转发(perfect forwarding),允许将函数参数以原始类型(左值或右值)转发给其他函数。虚函数表的内容在编译的时候就已经生成了。在继承关系中,调用基类构造函数的时候,先将基类的虚函数表地址赋值给 vptr,接着调用子类构造函数的时候,又将子类的虚函数表地址赋值给 vptr。当一个包含虚函数的类的对象被创建时,编译器会确保在对象的内存布局中包含一个指向虚函数表的指针,即。

2024-07-29 00:33:42 233

原创 SRS流媒体源码解析--service

(1)对线程/协程的API的抽象// 存储线程的句柄// 条件变量// 锁// 获取线程/协程句柄// 条件变量操作// 创建一个新的条件变量实例// 销毁给定的条件变量// 使当前线程等待条件变量cond。线程会释放锁并阻塞,直到其他线程通过srs_cond_signal或srs_cond_broadcast唤醒它// 带超时的等待版本,如果在指定的timeout时间内条件未被满足,则函数会返回。// 唤醒一个等待在条件变量cond上的线程。

2024-07-29 00:33:01 373

原创 RTMP协议解析

RTMP(Real Time Message Protocol)是一种由Adobe公司提出的应用层协议,主要用于实时音视频数据的传输。RTMP协议的主要有以下特点:1. 多路复用:RTMP允许多个音视频数据流在单个TCP连接上进行传输。2. 分包传输:数据被分割成小的数据包进行传输,以优化网络传输效率。3. 时间信息:RTMP传输的数据包含时间戳,确保数据可以按正确的顺序和时间播放。4. 优先级设置:不同类型的消息可以被赋予不同的优先级,以在带宽受限时合理分配传输资源。

2024-07-27 01:56:08 883

原创 FLV格式解析

FLV文件由一个flv header和flvbody组成。FLV header:包含文件标识,头长度,是否存在音频、视频、保留位FLV body:由PreviousTagSize + Tag组成。ta有三种,分别是Audio tags, Video tags, Data tags。

2024-07-27 00:59:22 901

原创 H264格式解析

(Group of Pictures): 这是在实际应用中经常提到的概念,它是一个包含一个I帧和随后的P帧(预测帧)或B帧(双向预测帧)的图像组。一个GOP通常以一个I帧开始,后续跟着一系列依赖于该I帧进行解码的P帧和/或B帧。(双向预测编码图像帧)):提供最⾼的压缩⽐,它既 需要之前的图像帧(I帧或P帧),也需要后来的图像帧(P帧),采⽤运动预测的⽅式进⾏帧间 双向预测编码。这样做是为了保持解码效率和压缩效率之间的平衡。(预测编码图像帧):利⽤之前的I帧或P帧,采⽤运动预 测的⽅式进⾏帧间预测编码。

2024-07-26 23:38:15 297

原创 Linux io_uring

io_uring:使用两个队列,一个是提交队列(submission queue),用于提交 I/O 请求;epoll:主要用于通知 I/O 事件的就绪状态,但实际的 I/O 操作(如 read 和 write)仍然需要通过系统调用来完成。io_uring:提供了无锁的用户空间和内核空间通信机制,这意味着在高并发场景下,io_uring 可以减少锁争用,提高性能。io_uring:原生支持异步 I/O 操作,可以直接在用户空间管理 I/O 事件,减少了系统调用的开销。这是一条吃饭博客,由。

2024-07-25 00:05:52 152

原创 C++笔试题目总结(一)

A 全局函数 B 拷贝构造函数 C 析构函数 D 私有成员函数答:ABD。A. 全局函数 - 全局函数不属于任何类,因此它们不能被声明为虚函数。虚函数是类的成员函数,用于实现多态。B. 拷贝构造函数 - 拷贝构造函数不能被声明为虚函数。拷贝构造函数是在对象被复制时被调用的,它是非虚的,因为它的调用发生在对象的生命周期开始时,此时多态还无法发挥作用。D. 私有成员函数 - 私有成员函数不能被派生类访问,因此它们不能参与多态机制,也就不能被声明为虚函数。

2024-07-25 00:05:19 864

原创 leetcode165.解密数字

假设f(i)代表i个数字之前的解,那么新加入一个数字后,需要考虑两种情况,第一种情况这个数字只能单独翻译成一个字母,这种情况下加了也白加,f(i+1) = f(i);那这种情况下f(i) = f(i-1) + f(i-2)。事实上因为这个地方无论是个位数还是两位数,最多只能翻译成1种字母,如果可以翻译成多种字母,那么就成了f(i) = g(i) * f(i-1) + g(i-1, i) * f(i-2)。所以有公式f(i) = f(i-1) +f(i-2) 或者 f(i) = f(i-1)。

2024-07-22 23:56:12 340

原创 设计模式简述(二)

人话:工厂模式的升级版本,写程序的时候可能有若干个工厂,实现一个工厂创造器/生成器类,获取具体工厂,再通过具体工厂获取实例化的类对象。人话:把处理对象封装在一个函数或者类的内部,然后按照执行这些处理对象,每个处理对象可能解决部分问题,直到问题被全部解决。人话:类的嵌套,把相似的类存储到一个容器中,一般容器对象和叶子对象通常实现同一个接口或继承同一个抽象类。定义:过组合和递归组合的方式来动态地增加对象的功能,而不是通过修改现有类的接口来实现功能的扩展。学C/C++就找挨踢零声,加入挨踢零声,面试不挨踢!

2024-07-22 00:12:34 560

原创 FFmpeg开发环境搭建

FFmpeg是音视频开发必备的库,也是唯一的库。本文主要讲解在ubuntu22和macOS14环境下的编译安装。为什么要自己编译呢?其中一个很重要的原因就是ffmpeg在编译时可以加入很多插件,这种特定的库网络上可能找不到编译好的版本,另外如果需要在ffmpeg基础上进行二次开发,也需要进行手动编译。对于新手只推荐在Linux/macOS上进行编译。经过本人的测试ffmpeg4/5/6都能在这两个系统上轻松搞定,但是windows上编译非常困难。

2024-07-21 14:49:47 1128 1

原创 设计模式简述(一)

定义:设计模式指的是在软件开发过程中,经过验证的,用于解决在特定环境下,重复出现的,特定问题的解决方案。创建型设计模式关注对象的创建过程,提供了更灵活、可扩展的对象创建机制前提:具体需求有稳定点也有变化点,希望将来能够修改少量代码就能适应需求的变化基础:继承、封装、多态。

2024-07-21 14:48:36 586 1

原创 SDL常用结构体和函数接口

SDL_CreateTexture:在给定的渲染上下文中创建一个新的纹理(Texture),纹理可以理解为用于渲染的图像数据。包括渲染器指针、纹理的格式、宽度、高度以及访问纹理的方式(如SDL_TEXTUREACCESS_STATIC)。函数接受多个参数,包括窗口的标题、初始x和y位置、宽度、高度以及一些窗口标志(比如是否全屏、是否允许调整大小等)。于让程序暂停指定的毫秒数。SDL_RenderClear:用当前设置的清除颜色填充整个渲染目标(通常是屏幕或一个纹理),清空之前的绘图内容准备新的绘制。

2024-07-20 07:34:49 905

原创 C++语言相关的常见面试题目(一)

省流:创建指针时,指针要么初始化为空,要么指向一个对象;释放内存后指针置空。不同点:浅拷贝只会复制动态成员的地址,新旧对象的动态成员指向同一块内存;深拷贝会复制动态成员指向的内存,新旧对象的动态成员指向不同的内存,虽然数据一样但是互不影响。(1)区别:指针可以初始化也可以不初始化,也可以为空,指针是一个对象。(2)作用:共同作用:传递参数,避免对对象和数据的复制;(3)类继承的基类有默认拷贝构造函数,或者基类中有虚函数。(2)类内的成员类有默认的拷贝构造函数。省流:(1)类内部的成员类提供默认构造函数。

2024-07-20 07:12:50 575

原创 环形链表题解

这里再补充一点,很多的文章都说若链表有环,则快慢指针必定相遇,并且还类比了龟兔赛跑的例子,说是在一个操场上,a和b以不同的速度沿着相同的方向出发一定会相遇。即b走的距离是环的正整数倍,b指针会回到enter,也就是环的入口,这个时候ab指针也相遇了,意味着a指针所在的位置就是环的入口。第一次相遇在meet点,meet点到enter点的长度是n,start到enter的长度是m,第一次相遇时慢节点走了a圈,a大于等于0,快节点则走了b圈,b大于等于1(为什么大于等于1呢?事实上是一定会相遇的。

2024-06-29 21:22:15 919

原创 Linux网络编程常见面试题

第三次:客户端收到服务器的SYN+ACK报文后,会检查确认号是否正确(即确认号是否为x+1),并发送一个确认报文给服务器。此外,这个报文的SYN标志位为0,因为客户端已经在第一次握手中发送过SYN,而ACK标志位为1,确认了服务器的SYN报文。这个报文包含确认号(ACK,即ack=x+1),表示收到了客户端的序列号x,并期待收到序列号为x+1的数据段。第四次挥手:客户端收到服务器的FIN报文后,会发送一个ACK报文作为响应,ACK标志置为1,确认号(ack)设置为y+1,表示收到了服务器的FIN报文。

2024-06-29 00:02:33 648

原创 mysql常见面试题

优化器制定执行计划,选择成本最小的计划执行。答:查询语句不当:定期清理数据库表中无用的数据,避免使用select *,不必要的子查询,explain看执行计划是不是慢查询。幻读:指一个事务在读取某个范围的数据时,另一个事务在该范围内插入了新的数据,导致第一个事务在后续读取时发现了“幻影”行。序列化:提供最高级别的隔离,通过强制事务串行执行来避免脏读、不可重复读和幻读,但性能较差,因为会限制并发性。读未提交:最低级别的隔离,允许一个事务可以读取另一个事务未提交的数据,可能导致脏读、不可重复读和幻读。

2024-06-28 23:56:42 471

原创 Redis连接池的实现

一个Redis连接池的基础部分包括定义连接池、连接池初始化、获取连接、回收连接、销毁连接池。同时还要兼顾连接池的线程安全。今天闲着没事干,手搓一下C++ redis连接池。Redis连接池的作用:管理个连接,避免反复创建和销毁带来的开销,还能提高并发量。Java的设计理念:轻轻打下import,剩下的交给jar包。C++的设计理念:道法自然 (给你铁与火,你造不出剑别赖我)好累啊,晚上去吃华莱士奖励一下自己,这是一条吃饭博客,由。从连接池中获取一个redis连接。连接池的定义、初始化和销毁。

2024-06-26 21:02:19 186

原创 Redis面试常见问题

答:Redis 是 Remote Dictionary Service 的简称;也是远程字典服务;redis是一个基于内存的键值数据库。常见的应用场景有以下几个:(1)作为关系型数据库的缓存。mysql等关系型数据库查询数据需要进行磁盘上的io比较耗时,可以在一次查询后把结果存储到redis里面,后面再查询直接从redis中读取数据。尤其是一些公共的、高频访问的静态资源,例如网页上的静态图片等。(2)作为cookie的替代存储用户会话。(3)作为消息队列使用。

2024-06-26 01:30:29 778

原创 Linux C++线程池的设计与实现

简单的来说就是二级指针进行解引用,可以控制从起始地址到起始地址+8个字节的空间,为什么时8个字节因为二级指针解引用后是一级指针,一级指针只占用8个字节的内存。很多例子使用std里面的vector和queue来管理线程和任务队列,虽然方便好用但是不是很能够深入,而且c++语言特性过多不利于理解线程池的核心思想,因此本文只使用C语言实现。任务管理模块主要负责接收外部提交的任务,将其加入到任务队列中,并确保这些任务能被线程池中的线程正确执行。线程管理模块主要负责线程的创建、销毁、以及线程的同步与通信。

2024-06-25 02:23:19 1085

原创 Linux C++指针

很多同学在初学C语言的时候都接触过指针,知道指针存储的是一个内存地址,也知道指针能访问内存,但是内存是一段存储空间,指针只是存储了内存空间的起始地址,想要访问这段内存,还需要知道控制的内存空间有多大,如何获取空间的大小信息呢?从结果来看,五级指针e存储的是一个内存的地址,对五级指针解引用后获得的四级指针,值是0xa0000000a,就是16进制下的10,这个值就是我们定义的a的值,三级指针直接没有打印出来,程序就报错了:segmentation fault。一般是访问了不存在的内存地址会出现这个。

2024-06-24 23:09:53 878

原创 传输层网络协议:KCP解析

序列号和确认应答:TCP使用序列号对发送的数据进行编号,接收方在收到数据后会发送确认应答,通知发送方已成功接收。重传机制分为GBN和SR,前者采用累计确认,某个数据包没有收到确认号,会重发该数据包和之后所有的数据包,后者每个数据包采用单独的计时器,超时之后只会重传未收到确认号的数据包。这里说明一下,TCP和KCP都是面向连接的全双工协议,发送端和接收端的数据传输是相互的,接收端出了ack数据包外还可能发送其它的数据包,在其他的数据包中也加入UNA信息就避免了增加太多的网络开销,遥遥领先!

2024-06-23 07:15:26 967

原创 Linux网络编程(二)

这篇文章主要讲解常见的Linux网络编程模型select/poll/epoll对应接口的基础用法,侧重于服务端。

2024-06-23 00:04:06 426

原创 Linux C++网络编程(一)

最近要准备面试了,总结一下Linux网络编程。

2024-06-21 22:42:21 606

原创 Linux c++ 工程管理知识点(一)

但是这个项目如果需要换其他系统环境,再进行重新编译就不是很方便了,因为机器上安装的库目录不一定相同,有些自己手动编译的库可能安装在其他位置。多数编译好的库都是支持cmake配置的,可以找一下官方文档。需要注意的是cmake内置常量或者变量都是大写的,为了避免混淆,自定义常量或者变量的时候尽可能使用小写字母。include_directories:头文件路径, 需要注意的是有些库比较坑爹,include目录下面还有个子目录,这个时候也要把子目录加上不然会报错找不到头文件。查看当前文件夹内容:ls。

2024-06-21 04:34:23 517

原创 关于TCP连接三次握手和四次挥手的理解

于是对小王说,小王啊,部门规定员工下班时间不得早于领导,以后我下班了会通知你,你在我通知之后准备下班,准备好了告诉我一声,你不说一声我要是在你后面走了,多不好看,我先走你再走啊。小王这次听清楚了,然后说,好,我去打扫卫生,主任也听清楚了,说了句嗯,去吧。没过多久,公司集团总部的领导要来视察,主任再一次把小王叫到了办公室,对小王说:“明天下午2点马东没领导要来检查,你去接待一下”。一天上午,主任把小王叫到办公室,对小王说,小王啊,上午11点华为的工程师来公司安装服务器,你去迎接一下吧。

2024-06-11 23:43:46 270

空空如也

空空如也

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

TA关注的人

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