- 博客(332)
- 资源 (4)
- 收藏
- 关注
原创 深入理解 C++ 字节序、内存对齐、强制类型转换:三大核心特性 + 五大高频考点实战解析
本文探讨了计算机系统中的两大重要概念:字节序和内存对齐,并介绍了C++中的静态类型转换。字节序部分比较了大端序和小端序的区别,提供了检测方法,并解释了字节序问题的重要性。内存对齐部分阐述了其原理、规则,并通过结构体示例展示了内存布局。静态类型转换部分详细解析了static_cast的用法、适用场景及限制。文章最后总结了相关面试考点,包括字节序判断、网络/主机字节序区别、内存对齐原因及控制方法,以及static_cast的特点。这些底层知识对理解计算机系统和编写高效代码至关重要。
2025-07-09 09:00:00
916
原创 深入理解 C++ 多进程:七大核心特性 + 六大高频考点实战解析
多进程编程摘要 多进程编程通过操作系统创建多个独立进程,每个进程拥有独立地址空间。核心包括: 进程管理: 使用fork()创建子进程,父子进程共享代码但数据独立(写时复制) wait()/waitpid()回收子进程,避免僵尸进程 进程间通信(IPC): 管道:匿名管道(父子进程单向通信)和命名管道(无关进程通过文件通信) 共享内存:高效数据共享,需配合信号量同步 消息队列:结构化异步通信 信号量:进程同步控制 关键考点: 进程vs线程区别(独立性、开销) 孤儿/僵尸进程成因及解决方案 守护进程创建流程(f
2025-07-08 02:00:00
1247
原创 深入理解 C++ 多线程:五大核心特性 + 九大高频考点实战解析
本文介绍了C++多线程编程的核心概念与实现方法。主要内容包括:1)C++11标准引入的跨平台线程支持;2)线程创建与管理(join/detach/joinable);3)线程同步机制(互斥锁、读写锁、条件变量、原子操作和自旋锁);4)线程池的实现原理与代码示例。文章重点讲解了如何利用<thread>标准库进行多线程开发,并详细说明了各种同步机制的使用场景和注意事项,最后通过一个简单的线程池实现展示了多线程技术的实际应用。
2025-07-08 01:00:00
891
原创 深入理解 C++ 静态多态、动态多态:六大核心特性 + 十五大高频考点实战解析
本文探讨了C++中静态多态与动态多态的实现原理。静态多态通过函数重载、运算符重载和模板在编译时确定调用,具有性能优势;动态多态则借助虚函数和继承机制实现运行时绑定,提供设计灵活性。文章详细分析了两种多态的技术实现,包括汇编层面展示函数重载原理,并解释了虚函数表的动态绑定机制,为开发者选择合适的多态方案提供了理论依据。
2025-07-07 01:30:00
1254
原创 深入理解 C++ 继承、菱形继承:四大核心特性 + 八大高频考点实战解析
摘要:C++继承机制解析:从基础到菱形继承解决方案 本文系统介绍了C++继承机制的核心概念与应用。首先阐述了三种继承方式(公有、保护、私有)及其访问权限控制,详细讲解了继承中的构造与析构函数调用顺序。重点分析了多继承中的菱形继承问题及其解决方案——虚继承机制,通过虚基类表指针实现单一基类副本共享。文章还涉及函数重写、final关键字等高级特性,并通过内存布局示例展示了编译器优化行为。最后指出虚继承的有效应用场景,为开发者提供了全面的继承机制应用指南。
2025-07-07 01:00:00
813
原创 深入理解 C++内存管理相关细节:四大核心特性 + 十大高频考点实战解析
C++内存管理机制与RAII技术摘要 C++提供两种内存管理方式:C风格的malloc/free和C++的new/delete运算符。malloc分配未初始化内存,返回void指针;free释放内存。new自动计算大小并调用构造函数,失败时抛出异常;delete调用析构函数并释放内存。new/delete的实现涉及operator new和operator delete函数,包括标准版本、nothrow版本和placement版本。 RAII(Resource Acquisition Is Initiali
2025-06-27 12:15:00
754
原创 深入理解 枚举与强枚举类型:四大核心特性 + 四大高频考点实战解析
C++强枚举类型(enum class)摘要: C++11引入的强枚举类型解决了传统枚举的三大缺陷:命名空间污染、隐式类型转换和底层类型不确定。强枚举通过作用域限定(必须使用Enum::Value访问)、禁止隐式转换和允许指定底层类型,提供了更好的类型安全性。高级特性包括前向声明、显式类型转换以及C++20的using enum简化语法。实际应用中,强枚举适用于参数传递、位标志组合和状态机实现。与传统枚举相比,强枚举在编译期提供类型检查,不会带来运行时开销,是更安全的工程实践选择,特别适合需要明确语义和防止
2025-06-27 12:00:00
444
原创 深入理解 std::shared_ptr 与 std::weak_ptr:八大核心特性 + 十一大高频考点实战解析
本文介绍了C++智能指针中的shared_ptr和weak_ptr。shared_ptr通过引用计数机制实现自动内存管理,支持自定义删除器、数组操作和线程安全的引用计数操作,但需注意循环引用和从原始指针多次创建的问题。weak_ptr作为shared_ptr的观察者,不增加引用计数,可用于解决循环引用问题,提供安全的对象访问检查机制。文章详细讲解了两种指针的基本操作(创建、重置、交换等)、内部实现机制(控制块)、线程安全特性以及典型应用场景,特别是weak_ptr在循环引用问题中的解决方案。
2025-06-26 16:47:38
1024
原创 深入理解 std::unique_ptr:七大核心特性 + 四大高频考点实战解析
C++11 引入的 std::unique_ptr 是现代 C++ 资源管理的基础设施之一,它代表独占所有权语义,具备自动析构、零成本异常安全等优势,替代裸指针显著提升代码健壮性。本文通过六大核心特性讲解 unique_ptr 的使用方法和常见场景,同时结合自定义实现与 STL 实战,系统梳理七个面试高频考点,助你真正掌握智能指针的内功心法。
2025-06-26 16:42:44
385
原创 深入理解 C++ volatile 与 atomic:五大用法解析 + 六大高频考点
本文详细介绍了C++中的volatile关键字和std::atomic模板类。volatile用于防止编译器优化,确保每次访问都从内存读取,适用于硬件寄存器访问、信号处理等场景,但不提供线程安全性。std::atomic则提供了真正的原子操作支持,包括基本原子操作、算术运算和多种内存顺序选项(如顺序一致性、获取/释放语义等),适用于多线程环境。文章还对比了两者的区别,指出atomic能保证线程安全和原子性,而volatile不能。最后强调了atomic的性能开销和复杂同步问题的处理方案。
2025-06-23 15:08:10
955
原创 深入理解 C++ Lambda表达式:四大语法特性 + 六大高频考点全解析
C++11引入的Lambda表达式简化了匿名函数的编写,解决了传统方式的不足。。Lambda常用于STL算法、回调函数等场景,具有简洁、可捕获上下文等优势。C++14还扩展了泛型Lambda,使其更灵活。相比单独函数、函数对象和函数指针,Lambda提供了更优雅的解决方案。
2025-06-23 15:04:15
940
原创 深入理解 C++ 浅拷贝深拷贝右值引用与完美转发:四大用法解析 + 八大高频考点
本文介绍了C++中对象拷贝和移动的不同机制: 浅拷贝:仅复制成员变量值(包括指针值但不复制内容),容易导致双释放问题。 深拷贝:递归复制所有成员变量,包括指针指向的内存,保证对象完全独立但性能较低。 移动构造(C++11):通过右值引用"窃取"临时对象资源,避免不必要的复制,提高性能。 完美转发:保留参数的原始性质(值类别和修饰符),实现高效参数传递。 文章通过代码示例和示意图展示了每种机制的特点和适用场景,帮助理解不同拷贝/移动方式的选择依据。
2025-06-16 15:54:38
1050
原创 深入理解 C++ inline:三大语法特性 + 七大高频考点全解析
本文系统性讲解了 C++ 中 inline 关键字的设计原理、实际用途与易混淆点,覆盖函数内联展开机制、类内默认内联行为、C++17 引入的 inline 变量支持等七大语法特性;同时深入剖析面试与工程实践中的八大高频考点,包括 inline 与宏的区别、递归与虚函数支持情况、构造与析构的内联可行性等,结合代码示例、编译器行为分析与现代规范
2025-06-16 15:54:03
722
原创 深入理解 C++ const:九大用法解析 + 八大高频考点
本文系统解析 C++ 中 const 的语义机制与应用场景,涵盖变量、指针、引用、成员函数、mutable、constexpr 等,结合内存模型与工程实践,揭示其在性能优化、类型安全与并发中的关键价值。
2025-06-13 15:32:06
969
原创 C++ static 关键字的全面解析:从局部变量到类成员,再到高频面试考点
static关键字在C++中的五种主要用法: 修饰局部变量:延长变量生命周期,保持函数调用间的值不变 修饰全局变量/函数:限制作用域为当前文件 修饰类静态成员变量:属于类而非对象,所有实例共享 修饰类静态成员函数:只能访问静态成员,不可用this指针 常考点: 静态函数不能是虚函数 静态成员可以被private修饰(需通过公共接口访问) 在C++11后,静态变量初始化线程安全,但读写需额外同步
2025-06-13 15:15:54
184
原创 有限时间 vs 固定时间 vs 预定时间滑模:稳定性分析与仿真验证方法对比(下)
预定时间滑模控制(PTSMC)旨在解决固定时间收敛系统中收敛时间上界难以直接确定的问题。通过定义预定时间稳定系统,其收敛时间上界可由显式参数直接确定,而其他参数则用于调节系统动态表现。文章详细推导了系统的李雅普诺夫函数,并证明了系统在预定时间内收敛到原点的稳定性。通过示例和MATLAB代码,展示了系统在预定时间内的收敛行为,验证了理论分析的有效性。结果表明,系统在预定时间内能够稳定收敛,但后续动态表现可能存在波动,符合预期。
2025-05-25 20:41:57
1343
原创 有限时间 vs 固定时间 vs 预定时间滑模:稳定性分析与仿真验证方法对比(中)
有限时间滑模控制(FTSMC)和固定时间滑模控制(FixTSMC)是两种重要的控制策略,旨在实现系统状态的快速收敛。FTSMC通过设计滑模面和控制律,确保系统状态在有限时间内收敛到原点,但其收敛时间与初始状态相关。FixTSMC则进一步优化,使收敛时间与初始状态无关,适用于高动态环境,具有更强的鲁棒性和更平滑的控制信号。两种方法均通过李雅普诺夫函数证明其稳定性,并通过仿真验证其有效性。FixTSMC在工程应用中更为可靠,尤其适合安全关键系统。
2025-05-25 20:39:46
1891
原创 有限时间 vs 固定时间 vs 预定时间滑模:稳定性分析与仿真验证方法对比(上)
本文主要介绍了非线性自治系统的稳定性定义及其相关概念,包括李雅普诺夫稳定、渐近稳定、有限时间稳定和固定时间稳定。通过定义和数学描述,阐述了系统在原点处的平衡点稳定性条件。此外,文章还详细讨论了李雅普诺夫函数在系统稳定性分析中的应用,并通过一个二阶非线性系统的示例,展示了如何设计李雅普诺夫函数和控制输入以确保系统的渐近稳定性。最后,通过Matlab仿真验证了所设计控制策略的有效性。
2025-05-23 16:59:42
1517
原创 跨域问题及其CORS解决方案:gin框架中配置跨域
浏览器同源策略(Same-Origin Policy)是Web安全的重要机制,要求只有协议、域名和端口完全相同的请求才被视为同源,允许正常访问。该策略限制了跨源DOM访问、AJAX请求、Cookie和LocalStorage等数据的读取,有效防止跨站脚本攻击(XSS)等安全威胁。然而,为了满足实际开发需求,浏览器也提供了一些例外,如静态资源加载、CORS(跨源资源共享)、JSONP技术等。CORS通过预检请求和响应头实现受控的跨域访问,开发者可以通过配置服务器响应头或使用中间件(如Gin框架的cors中间件
2025-05-23 16:59:04
907
原创 RESTful API设计:从原则到Gin实现
RESTful API 是一种基于 HTTP 协议的架构风格,广泛应用于现代 Web 应用的前后端通信。其优势包括设计简单直观、无状态性、良好的可扩展性和跨平台互操作性。核心设计原则包括使用 HTTPS 协议、专属域名、版本控制、资源路径、标准 HTTP 方法和状态码。然而,RESTful 架构也存在一些局限性,如数据获取效率问题、同步请求的性能瓶颈、客户端与服务器的紧耦合等。随着应用需求的发展,GraphQL、gRPC 等新兴技术提供了替代方案。本文还通过 Gin 框架展示了如何设计一组符合 RESTfu
2025-05-21 15:19:32
682
原创 AES加密:数学魔法如何守护你的数字秘密
AES(高级加密标准)是一种广泛使用的对称加密算法,支持128、192和256位密钥长度。其加密过程包括多轮重复的变换操作。首先,通过随机生成的种子密钥生成多个轮密钥,轮密钥的生成涉及字节旋转、字节替换和轮常量异或等步骤。加密过程包括轮密钥加、字节代换、行位移、列混淆等操作,最终生成密文。解密过程则是加密的逆过程,包括逆向行位移、逆向字节代换、逆向列混淆等步骤。AES的安全性依赖于其复杂的密钥扩展和多重变换操作,确保数据在传输和存储中的安全性。
2025-05-21 15:08:09
1152
原创 HTTPS全解析:从证书签发到TLS握手优化
HTTPS是HTTP的安全版本,通过TLS/SSL协议加密数据传输,防止窃听和篡改。现代HTTPS主要使用TLS协议,最新版本为TLS/1.3,相较于TLS/1.2在安全性、性能和隐私保护方面有显著提升。HTTPS通过CA证书验证服务器身份,防止用户误入钓鱼网站。TLS/1.3简化了握手过程,支持1-RTT和0-RTT会话恢复,强制使用前向安全的ECDHE密钥交换,并优化了加密算法,提升了通信效率和安全性。TLS/1.3还增强了降级攻击防护,确保通信安全。
2025-05-12 20:39:43
1606
原创 密钥更短、速度更快--ECC如何重新定义现代加密
在当今的数字世界里,加密算法是保护数据安全的核心。几十年来,**RSA**(基于大数分解难题)一直是公钥加密的黄金标准。但随着计算能力的提升和量子计算的威胁,RSA 的局限性逐渐显现——它需要很长的密钥(2048位甚至更长)才能保证安全,导致计算开销大、速度慢。而 **椭圆曲线加密(ECC, Elliptic Curve Cryptography)** 的出现,彻底改变了这一局面。它能够在**更短的密钥长度**下提供**同等级甚至更高的安全性**,同时计算速度更快、资源消耗更低。
2025-05-12 15:11:28
636
原创 非对称加密:为什么RSA让“公开传密”成为可能
RSA算法通过非对称加密机制彻底改变了安全通信的方式,使得陌生人无需预先共享密钥也能建立安全连接。其核心原理是利用大质数分解的数学难题——公钥(用于加密)可以公开分享,而私钥(用于解密)则严格保密,即使攻击者获取公钥和密文,也无法在合理时间内破解。虽然RSA支撑着HTTPS、数字签名等关键技术,但其计算效率较低且面临量子计算的潜在威胁,因此实际应用中常与对称加密(如AES)结合使用,同时后量子密码学正在探索更安全的替代方案。
2025-05-08 22:15:21
825
原创 从颜料混色到网络安全:DH算法的跨界智慧
迪菲-赫尔曼(DH)密钥交换算法通过巧妙的数学设计,让通信双方能在公开信道安全协商共享密钥。其核心是利用离散对数问题的计算复杂性,使双方各自生成相同的密钥,而窃听者即便截获全部交换数据也无法破解。这种无需预先共享秘密的密钥交换方式,为HTTPS、VPN等安全通信奠定了基础,但需注意其本身不提供身份认证,可能遭受中间人攻击。
2025-05-08 22:02:35
1325
2
原创 B+树的原理图解
B+树是B树的变体,也是广泛应用于数据库和文件系统中的一种自平衡的树形数据结构。与B树不同的是,B+树所有的键值都保存在叶子节点中,内部节点仅作为索引使用。这种结构使得B+树在查找、范围查询等操作中比B树更加高效。
2024-10-17 12:47:07
1855
原创 B树的原理与CPP实现
B树是一种自平衡的多叉树数据结构,广泛应用于数据库系统和文件系统中。其设计初衷是为了在存储设备上实现高效的读写操作,特别是在磁盘存储或其他大规模存储场景下。B树的每个节点可以有多个子节点,这与二叉树不同,B树能有效减少树的高度,从而减少数据检索时磁盘的I/O操作次数。本文将详细介绍B树的性质,以及它的查找、插入和删除操作。
2024-10-17 12:46:40
1543
原创 布隆过滤器的原理
布隆过滤器(Bloom Filter)是一种用于检验某个元素是否在集合中的概率性数据结构。它由布隆于1970年提出,具有很高的空间利用效率,但其结果存在一定的不确定性:要么说明该元素肯定不在集合中,要么说明该元素可能在集合中。因此,它经常用于需要快速检索但允许小概率误判的场景。
2024-10-16 18:17:52
1044
原创 跳表的原理与cpp实现
8+4+2=n-2。如果每两个结点会抽出一个结点作为上一级索引的结点,那第一级索引的结点个数大约就是 n/2,第二级索引的结点个数大约就是 n/4,第三级索引的结点个数大约就是 n/8,依次类推,也就是说,第 k 级索引的结点个数是第 k-1 级索引的结点个数的 1/2,那第 k级索引结点的个数就是。:从最高层开始,如果该层中存在目标节点,则将其从链表中删除,更新前驱节点的指针,使其指向目标节点的后继节点。实现,在实现的时候,每层节点并不是一个结构存储的,而是一个节点就是一个结构存储,类似下面这个图。
2024-10-16 13:52:33
1107
原创 无锁队列实现(Michael & Scott),伪代码与c++实现
c++的实现就直接看上述的伪代码跟着实现即可,这里的一些atomic操作也可以看我之前写的博客。可以看到,多线程下可以顺利的插入与找到数据。
2024-10-16 13:51:38
520
原创 C++中的六种内存序详解
C++11中的内存序(Memory Order)为开发者提供了工具,帮助控制多线程程序中不同线程之间的内存操作顺序,从而避免由于编译器或处理器优化导致的指令重排问题。这些内存序提供了从无序到严格一致的内存访问保证,让程序员能够在性能和安全性之间进行权衡。本文将详细介绍C++中的六种内存序,并通过实际例子补充说明它们的应用场景。
2024-10-14 15:00:39
1439
原创 C++11中的原子操作及其底层缓存一致性
C++中的原子变量通过无锁的原子操作来保证多线程环境下的线程安全,并提供多种内存顺序模型供开发者根据需求进行性能调优。使用原子变量可以有效避免数据竞争,并简化多线程编程中的同步问题。
2024-10-14 14:03:19
1781
原创 c语言位域详解
位域是一种可以让结构体的成员变量以位为单位进行存储和操作的特性。位域允许我们精确控制数据的存储方式,而不像普通的整型变量那样固定使用系统规定的字节大小。通过位域,我们可以在一个整型数据中指定具体的位数来表示某些信息。比如,如果我们只需要一个变量的某些位来表示状态,我们可以用位域来减少存储空间。位域操作看上去很好,但是其实处处受限,其跨平台性很差,使用时应该谨慎。
2024-10-09 18:56:20
721
原创 使用双向链表和哈希表实现LRU缓存
通过以上的实现,我们可以看到LRU缓存可以通过双向链表和哈希表的结合高效实现。双向链表用于维护缓存项的顺序,哈希表用于快速查找缓存项。每次访问或插入时,都将对应项移动到链表的头部,而当缓存超出容量时,淘汰链表尾部的最久未使用数据。这种设计使得LRU缓存的查找插入删除操作都能在 O(1) 时间内完成,非常适合在高频率数据访问场景下使用。
2024-09-27 17:58:57
1425
原创 快速选择算法--无序数组中寻找中位数 O(n)的算法及证明
快速选择算法有点类似于快速排序,可以帮助我们快速找到数组中的第k个元素。但是快速排序的时间复杂度是。最差时间复杂度就可以看做每一层选择的值都很差,都需要和剩下的n-1个值比较。这就很简单,没什么说的了,只需要注意如果数组为偶数需要求两个数的平均值。排序的算法是最容易想到的,但是即使是快排,平均复杂度也只有。2、将数组分为三个部分,小于基准,等于基准,大于基准。其中k是递归深度,直到n变为1。1、随机选择一个元素作为基准。为什么快速选择算法就是。
2024-09-27 17:09:44
1531
原创 系统在哪些情况下会触发缺页中断
这意味着当程序访问某个内存地址时,如果该页尚未被加载到物理内存中,则会触发缺页中断。当程序再次访问这些已被交换到磁盘上的内存页时,会发生缺页中断。操作系统会将这些页从磁盘交换回物理内存。这时,如果该内存页尚未映射到物理内存,操作系统会触发一个缺页中断,并将对应的页映射到物理内存。当一个程序尝试访问一个虚拟内存地址,而该地址没有映射到物理内存(即该地址没有分配有效的物理内存页),操作系统会发生缺页中断。如果程序试图访问一个被标记为只读或禁止访问的内存区域(例如,写入一个只读页面),也会触发缺页中断。
2024-09-19 21:32:37
712
原创 C++中move和forword的区别
move用于将一个对象的资源所有权从一个对象转移到另一个对象,以避免不必要的复制。它是一种类型转换,表示你希望将一个对象视为一个右值,从而可以被“移动”而不是“复制”。forward用于完美转发模板参数。它确保在将参数传递给其他函数时,保留参数的值类别(即是左值还是右值)。这对于实现通用函数模板尤其重要。
2024-09-19 20:53:39
568
原创 多个线程如何轮流输出1到100
当线程需要等待某个条件变成真时,它会获取一个互斥锁,然后在条件变量上等待,等待期间会自动释放互斥锁。另一个线程在满足条件后会获取相同的互斥锁,并调用条件变量的 notify_one() 或 notify_all() 函数来唤醒等待的线程。是用于线程间协调的强大工具。这个面试问题主要考察如何让线程同步,首先线程同步必会用到的就是互斥锁,互斥锁保证多个线程对数据的同时操作不会出错。(条件变量)是 C++11 中提供的一种多线程同步机制,它允许一个或多个线程等待另一个线程发出通知,以便能够有效地进行线程同步。
2024-09-07 15:20:01
643
麦克风阵列资料.zip
2020-09-06
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人