自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 设计模式学习

简单工厂模式-CSDN博客 工厂模式~-CSDN博客 抽象工厂模式-CSDN博客 简单工厂和工厂模式的区别-CSDN博客 工厂模式和抽象工厂的区别-CSDN博客 简单工厂、工厂模式、抽象工厂的区别-CSDN博客

2024-10-17 11:13:39 565

原创 三次握手四次挥手?

三次握手和四次挥手是TCP协议中建立和断开连接的基本过程,确保连接的可靠性和数据的完整性。通过三次握手,客户端和服务器可以同步序列号和确认号,建立可靠的连接。通过四次挥手,客户端和服务器可以优雅地关闭连接,确保所有数据都已经传输完毕。

2025-03-20 09:38:51 258

原创 科大讯飞一面c++面经

使用智能指针(如std::unique_ptr、std::shared_ptr)自动管理内存。使用内存分析工具,如 Valgrind 或 Visual Studio 的内存分析工具。在动态分配内存后确保每个new操作对应delete操作。C++中的什么是内存泄漏?内存泄漏如何检查?-CSDN博客线程安全指多个线程访问同一资源时不会导致竞态条件。可以通过锁、互斥量、条件变量等方式保证线程安全。什么是线程安全,如何保证线程安全?-CSDN博客。

2025-03-20 09:38:33 372

原创 什么是线程安全,如何保证线程安全?

线程安全(Thread Safety)是指多线程环境下,多个线程同时访问和操作同一资源时,程序的行为仍然是正确的,即不会因为多线程的并发操作而导致数据不一致或程序崩溃。

2025-03-19 14:39:10 485

原创 map、set和hashmap底层的实现?区别?hashmap一定比map效率高吗?

map和 set: 基于红黑树,提供有序存储,操作复杂度为 (O(\log n))。unordered_map和 unordered_set: 基于哈希表,提供无序存储,平均操作复杂度为 (O(1)),但最坏情况下为 (O(n))。效率: unordered_map 通常比 map 更高效,但在哈希冲突严重或需要有序存储时,map 可能更适合。

2025-03-19 14:33:37 422

原创 vector中的erase()迭代器什么时候失效?erase会释放内存吗?

调用 erase 后,指向被移除元素及其后的迭代器失效。erase 不会释放 vector 的内存容量,只是调整大小并销毁被移除的元素。如果需要释放未使用的内存,可使用 shrink_to_fit() 或交换技术。

2025-03-19 14:29:54 383

原创 vector底层实现原理?如何扩容的?clear会清除对应的内存吗?如何实现内容的清除和内存的释放?

std::vector 使用动态数组实现,保证元素连续存储。当需要扩容时,vector 会分配更大的内存块,搬移元素,然后释放旧内存。clear() 方法只是清除元素,不会释放内存。使用 shrink_to_fit() 或重新分配内存的方法可以实现内容清除和内存释放。

2025-03-19 14:25:15 534

原创 C++中的友元类?C++中友元类的作用,为什么不用封装接口访问私有变量,友元类的好处?

要声明一个类为另一个类的友元类,可以使用 friend 关键字。class A {// 声明B为A的友元类private:class B {public:// 由于B是A的友元类,它可以访问A的私有成员在上面的例子中,类 B 被声明为类 A 的友元类,因此 B 可以访问 A 的私有成员 secret。友元类在C++中提供了一种灵活的方式来访问另一个类的私有成员,适用于类之间需要紧密协作的情况。尽管友元类可以提高代码的简洁性和性能,但也需要谨慎使用,以避免破坏封装和增加耦合度。

2025-03-19 14:20:24 431

原创 C++中的什么是内存泄漏?内存泄漏如何检查?

内存泄漏是C++编程中常见的问题,通常由动态分配的内存没有被正确释放导致。尽管手动检查代码可以发现一些内存泄漏,但借助工具(如Valgrind、AddressSanitizer、Visual Studio内存检查工具等)可以更高效地检测和解决内存泄漏问题。使用C++11及以上版本的智能指针也是预防内存泄漏的有效方法。

2025-03-19 14:14:48 195

原创 C++中的异常捕获?

在C++中,异常捕获是通过try、catch 和 throw 关键字来实现的。这些关键字用于处理程序运行过程中可能发生的异常情况,以便程序可以优雅地应对错误而不是崩溃。下面是详细的描述: 当一个函数检测到错误或异常情况时,它可以使用 throw 关键字抛出一个异常。异常可以是任意类型的对象(如整型、字符串、对象等)。异常捕获(try-catch) 为了捕获异常并处理它们,使用 try 和 catch 语句。try 块中包含可能抛出异常的代码,而 catch 块用于捕获和

2025-03-19 14:11:18 603

原创 C++中new和delete创建对象的流程?

在C++中,new 和 delete 操作符用于动态分配和释放内存。它们在创建和销毁对象时涉及多个步骤,包括内存分配、构造函数调用、析构函数调用和内存释放。

2025-03-19 14:03:02 329

原创 C++中new和delete如何构建简单对象和复杂对象?

在C++中,new 和 delete 操作符用于动态分配和释放内存。具体来说,它们可以用于构建简单对象(例如基本数据类型)和复杂对象(例如包含多个成员变量或自定义构造函数和析构函数的类对象)。

2025-03-19 13:51:02 314

原创 线程间的同步方式

以下是常见的线程同步方式: 互斥锁是一种用于防止多个线程同时访问共享资源的同步机制。2. 读写锁(Read-Write Lock) 读写锁允许多个线程同时读取共享资源,但在写操作时会阻塞其他线程的读写。使用方式:3. 条件变量(Condition Variable) 条件变量用于阻塞线程,直到某个条件为真。通常与互斥锁一起使用。4. 信号量(Semaphore) 信号量是一种用于控制对资源访问的计数器。5. 自旋锁(

2025-03-19 13:43:42 300

原创 进程的同步方式?

共享内存允许多个进程直接访问同一块内存区域,是最快的进程间通信方式之一。消息可以带有类型,接收进程可以选择性地接收特定类型的消息。它允许一个进程的输出作为另一个进程的输入。信号量本身并不是一种通信方式,但常与共享内存结合使用,以实现进程间的同步。内存映射文件允许多个进程共享一个文件的内存映射区,实现进程间通信。信号是一种进程间通信的异步通知机制,常用于进程通知、异常处理等。RPC允许进程通过网络调用远程进程的函数,就像调用本地函数一样。命名管道类似于匿名管道,但可以在没有亲缘关系的进程间通信。

2025-03-19 13:38:36 373

原创 TCP和UDP的区别?

特性TCPUDP连接方式面向连接(三次握手)无连接可靠性可靠传输,保证顺序和完整性不可靠传输,不保证顺序和完整性数据传输方式面向字节流面向报文流量控制和拥塞控制提供流量控制和拥塞控制不提供流量控制和拥塞控制首部开销较大(至少20字节)较小(8字节)传输效率较低,但可靠较高,但不可靠应用场景适用于可靠性要求高的应用适用于实时性要求高的应用传输方式单播传输支持单播、广播和组播。

2025-03-19 13:25:53 385

原创 进程和线程的区别?

进程(Process):进程是操作系统分配资源的基本单位,是一个正在运行的程序实例。每个进程都有独立的地址空间、资源和数据。线程(Thread):线程是进程中的一个执行单元,一个进程可以包含多个线程,同一进程中的线程共享进程的资源和地址空间。进程和线程的主要区别在于资源分配、地址空间、调度机制、通信方式和独立性。进程是操作系统分配资源的基本单位,具有独立的地址空间和资源,适用于需要强隔离的场景。线程是进程中的执行单元,共享进程的资源,适用于需要频繁通信和共享资源的并发任务。

2025-03-19 13:22:16 573

原创 系统中内存分区

计算机内存按不同的管理和用途方式可以分为多个部分,包括:CPU缓存、主内存、硬盘存储、虚拟内存和外部存储等。每一部分内存都有不同的用途和特点,通过操作系统和硬件的配合,计算机能够高效地管理这些内存区域以满足不同的需求。

2025-03-19 13:13:12 346

原创 c++程序的内存分段

C++程序的内存划分通常分为以下几个部分:代码段、数据段、堆、栈、常量区以及程序内存映射。每一部分有不同的用途和特点,栈和堆特别重要,因为它们分别处理自动和动态内存分配。

2025-03-19 13:10:47 377

原创 qt如何实现跨平台,linux和windows开发,并且qt代码中如何处理跨平台

Qt是一个非常强大的跨平台开发框架,它可以让你在多个平台上编写和运行相同的代码,包括Linux、Windows、macOS等。Qt的一些类封装了不同操作系统的底层实现,确保在不同平台上有一致的行为。Qt通过提供不同的字体渲染引擎(如Qt::HighDpiScaleFactorRoundingPolicy)来处理不同平台的字体和分辨率问题,确保UI在不同平台上保持一致。Qt的底层代码为不同的平台提供了一个统一的抽象层。在Qt中,你可以通过QMAKE来控制不同平台的库依赖,确保每个平台都有合适的库。

2025-03-18 21:09:29 2111

原创 如何对一个无序单链表排序

对于链表来说,归并排序是一个特别适合的选择,因为它是一个稳定的排序算法,不需要额外的空间,并且具有较好的时间复杂度。通过比较两个链表的节点值,逐个将较小的节点加入到新的链表中,直到其中一个链表为空,最后将另一个链表剩余的部分接到合并链表的末尾。时间复杂度:每次递归都将链表分为两半,递归深度为 `O(log n)`,在每一层递归中合并链表的时间是 `O(n)`,因此总的时间复杂度为 `O(n log n)`。首先找到链表的中点,然后递归地对左右两个子链表进行排序,最后将两个已排序的子链表合并。

2025-03-17 21:42:55 320

原创 一个指针重复delete会怎么样?编译报错还是运行报错?报什么错?

3. 运行时错误:某些编译器或调试工具可能会检测到重复 `delete` 操作,并在运行时抛出错误或警告。具体来说,重复 `delete` 一个指针不会在编译时产生错误,因为编译器无法确定指针在运行时的状态。1. 程序崩溃(例如,段错误或访问冲突):这是最常见的情况,因为 `delete` 操作会试图释放已经被释放的内存,从而导致访问无效内存地址。在这个例子中,第一次 `delete ptr` 会正常释放内存,而第二次 `delete ptr` 则会导致未定义行为。

2025-03-17 21:21:31 252

原创 ffmpeg面试题整理

脚本化后处理效率提升 70%。获取详细日志信息,帮助调试。

2025-03-15 10:54:11 935

原创 ffmpeg基础整理

它支持几乎所有常见的音视频格式,功能极其强大,是开发者、视频创作者常用的命令行工具。编码速度与质量的平衡(如 -preset fast)设置视频码率(如 -b:v 1M表示 1Mbps)FFmpeg 是一个开源的跨平台。指定视频编码器(如 -c:v libx264)设置帧率(如 -r 30表示 30fps)指定音频编码器(如 -c:a aac)录制、转换、编辑、流式传输。

2025-03-15 10:49:05 536

原创 OpenGL疑惑

绑定不同的 VAO 会影响后续的操作,特别是与顶点属性(VBO)相关的操作,因为每个 VAO 都关联了不同的 VBO 和状态。如果你确实需要在同一时间操作多个 VAO,并且希望每次绘制时都切换不同的 VAO,那么你需要手动管理不同 VAO 的绑定。绑定 VAO 的目的是告诉 OpenGL 在当前上下文中使用哪个 VAO,它会保存和管理与该 VAO 相关的顶点缓冲区对象(VBO)和其他状态。创建的 VAO),之后 OpenGL 就会使用这个 VAO 中保存的状态,直到你切换到另一个 VAO 或解绑它。

2025-03-09 11:32:32 972

原创 QOpenGLShaderProgram 对象

在 OpenGL 中,着色器是用来在图形渲染流水线中处理顶点和像素的程序,它们定义了如何绘制每个顶点和每个像素的颜色。着色器程序会绑定顶点数据(比如顶点坐标、法线、颜色等属性)到特定的着色器变量(attribute),还可以绑定一些统一变量(uniforms),这些变量在渲染期间保持不变,例如变换矩阵、光源位置等。负责处理图像中每个像素的颜色。在这个代码中,shaderProgram 是 OpenGL 渲染的核心部分,负责在渲染过程中控制如何处理顶点数据和片段数据,决定了最终绘制到屏幕上的图形效果。

2025-03-09 11:25:12 957

原创 完整例子和调用关系qt OpenGL

负责 OpenGL 环境的初始化工作,包括启用深度测试、初始化着色器和顶点数据。首先,你需要在 Qt 项目中创建一个类,继承自 QOpenGLWidget 来进行 OpenGL 渲染。这个函数每次需要重新绘制时都会被调用。这里,我们清空屏幕,使用着色器程序,并通过 glDrawArrays() 绘制三角形。用于处理 OpenGL 上下文的大小变化,设置视口以及投影矩阵,使得绘制的图形不会在窗口大小变化时失真。这是实现文件,包含了 OpenGL 初始化、着色器编译、数据传输和渲染的具体代码。

2025-03-09 11:20:43 1107

原创 Qt 开发 OpenGL 程序流程

创建 Qt 项目并启用 OpenGL 支持。继承 QOpenGLWidget 并实现 initializeGL()、resizeGL() 和 paintGL()。设置并传递顶点数据到 GPU。编写顶点着色器和片段着色器。编译和链接着色器。使用着色器并开始绘制。

2025-03-07 17:49:23 826

原创 Wayland Architecture Wayland架构

本文只是翻译,原文地址。

2025-02-28 09:42:59 1260

原创 容器和编码区别

音视频容器和编码是多媒体技术中的两个重要概念,但它们有着不同的作用和功能。

2025-02-24 16:01:52 325

原创 音视频容器格式

不同的容器格式有不同的应用场景,从普通视频播放到专业级的视频制作、广播等都有不同的需求。兼容性:不同设备和平台支持的格式。压缩效率:对于流媒体和存储的压缩需求。功能需求:如支持多音轨、多语言字幕等高级功能。

2025-02-24 15:59:18 916

原创 码率和采样率

视频的码率指的是每秒传输的“数据量”,它影响视频的画面质量和文件大小。音频的采样率指的是每秒钟对声音信号采集的“次数”,它影响音频的音质和数据量。这两者命名上有差异,是因为视频和音频的处理方式不同,一个强调“数据传输量”,一个强调“采样频率”。

2025-02-24 14:39:06 707

原创 为什么父类要在子类前面构造?为什么子类要在父类前面析构?

如果父类在子类之前析构,那么子类在析构过程中尝试访问父类的成员或调用父类的方法时,会导致访问无效内存或未定义行为。通过先析构子类,可以确保子类在析构时仍然能够使用父类的功能和数据。

2025-02-24 11:11:09 475

原创 X Server 在混成关闭和应用暂停时的绘制原理

X Server的绘制是基于窗口的几何位置和窗口堆叠顺序来决定哪些区域需要更新,并不区分窗口是否处于“暂停”状态。即使暂停的应用停止绘制,当窗口重叠区域需要更新时,X Server 仍然会尝试重新绘制这些区域,导致残影问题。

2025-02-17 15:44:03 371

原创 OpenGL和Mesa的关系

Mesa 是 OpenGL 的开源实现,尤其是在 Linux 系统中。如果没有 Mesa 或类似的图形实现,OpenGL 就不能正常工作,无法与 GPU 交互。OpenGL本身只是一个图形 API,它依赖于图形库(如 Mesa、NVIDIA 驱动等)来与 GPU 进行交互。如果没有 OpenGL 实现,你无法利用 GPU 的图形加速功能,虽然有些库提供了软件渲染模式,但性能会大幅降低。因此,没有 Mesa(或其他图形驱动的实现),OpenGL 就不能有效地与 GPU 交互,它的功能将无法实现。

2025-02-12 16:36:14 489

原创 OpenGL的主要功能

OpenGL 主要是为与 GPU 交互提供接口,如果没有 GPU,OpenGL 还是能工作,但会退化为软件渲染,性能较差。Mesa提供了 OpenGL 和 Vulkan 的开源实现,如果没有硬件 GPU,Mesa 可以使用软件渲染来模拟图形绘制。如果没有 GPU,或者不使用 OpenGL,你仍然可以依赖 **软件渲染** 或其他图形库(如 Skia 的软件渲染、Cairo 等)来绘制图形,但这些方法效率较低,不适合复杂的图形应用。因此,没有 GPU 和 Mesa,你仍然可以绘制图形,但是。

2025-02-12 16:29:57 594

原创 当没有OpenGL时,Skia如何绘制?

Skia 本身支持多个后端,你可以在没有 OpenGL 的情况下依然使用 Skia 绘制图形。如果没有 OpenGL 或其他硬件加速后端,Skia 会使用软件渲染模式,通过 CPU 来绘制图形,但性能会大幅下降。在有些平台上(比如 macOS),Skia 也可以选择Metal或Vulkan等其他后端进行加速。所以,Skia 在没有 OpenGL 的情况下也能绘制图形,只是可能没有 GPU 加速,而使用的是较慢的软件渲染。

2025-02-12 15:50:46 813

原创 Skia、OpenGL、Mesa之间的关系

Skia 是你的应用中绘制图形的高层库,它可以依赖于 OpenGL 或 Vulkan 来加速渲染。- OpenGL 是一个底层图形 API,Skia 通过它与 GPU 进行交互。- Mesa 是 OpenGL 的开源实现,在 Linux 上,它为 OpenGL 提供了硬件加速的支持。因此,在 Skia 使用 OpenGL 绘图时,OpenGL 的底层实现会依赖 Mesa(在 Linux 系统上)来与 GPU 通信。

2025-02-12 15:45:38 727

原创 图形渲染(一)——Skia、OpenGL、Mesa 和 Vulkan简介

Skia:一个 2D 图形库,用来进行 2D 渲染,它依赖底层图形 API(如 OpenGL 或 Vulkan)来加速渲染。OpenGL 和 Vulkan:都是底层的图形 API,提供对 GPU 的控制和渲染操作。Skia 可以选择 OpenGL 或 Vulkan 作为底层 API 来执行实际的渲染任务。Mesa:是一个开源项目,提供对 OpenGL 和 Vulkan 等图形 API 的实现,特别是在 Linux 系统上。

2025-02-12 15:36:57 2928

原创 Could not open /dev/vmmon: ?????????.

【代码】Could not open /dev/vmmon:?????????

2025-02-10 13:36:38 345

原创 前缀和模式

前缀和是一种非常高效的技巧,适用于需要频繁查询区间和的问题。通过预处理前缀和数组,查询的时间复杂度可以降低到 (O(1))。这种方法广泛应用于很多问题,如数组区间查询、动态规划等问题中。

2025-01-02 13:31:24 1062

空空如也

空空如也

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

TA关注的人

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