C/C++
文章平均质量分 87
C/C++
LumiTiger
聚焦聚焦再聚焦, 顺其自然, 水到渠成, 所有的问题都因为自己还不够强大
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
内存泄漏-munmap操作问题
解决munmap地址不变munmap的addr必须是mmap返回的原始起始地址(或映射区内的页对齐子地址);长度对齐munmap的length必须与mmap的页对齐长度一致(或页对齐的子长度);校验返回值:必须检查mmapmunmap的返回值,及时处理错误;避免越界:禁止跨映射区解除,禁止重复解除。原创 2025-12-18 10:41:25 · 656 阅读 · 0 评论 -
怎么保证brk的内存完全释放?
要最大程度地保证brk内存的释放,关键在于减少内存碎片和主动引导glibc进行清理。对于新项目或特定场景,使用更现代的内存分配器(如jemalloc)往往是更根本的解决方案。希望这些具体的方案能帮助你解决这个棘手的问题!如果你能分享更多关于你的应用场景(例如,是长期运行的服务,还是短生命周期的工具),或许我可以提供更针对性的建议。原创 2025-12-18 10:30:36 · 229 阅读 · 0 评论 -
大内存通过mmap分配,释放后什么情况不能通过munmap直接归还OS
虽然mmap分配的大内存通常能被munmap直接归还,但在系统VMA数量耗尽、munmap参数错误或glibc分配策略改变等情况下,可能无法顺利归还。规范编程、理解系统限制和库行为是避免问题的关键。原创 2025-12-18 10:29:23 · 259 阅读 · 0 评论 -
布隆过滤器
布隆过滤器是一种空间效率极高的概率型数据结构,核心作用是快速判断「一个元素是否存在于集合中」。说「元素不在」→ 100%准确(绝对没在集合里);说「元素在」→ 可能误判(有小概率其实不在);极致省空间(比传统Set/哈希表省几个数量级)。布隆过滤器的核心是「用空间换时间+概率妥协」,适合「允许小概率误判、追求极致空间效率」的场景。按公式计算最优的m和k;实现均匀分布的哈希函数;对位数组进行高效的置1/检查操作。原创 2025-12-14 21:43:30 · 633 阅读 · 0 评论 -
std::promise 重难点
自定义异常需继承并实现what()// 自定义异常(专业写法)private:string msg;public:// 必须实现what(),且标记noexcept// 子线程抛自定义异常try {throw BusinessException("订单不存在");cout << "业务异常:" << e.what() << endl;// 订单不存在t.join();return 0;核心规则通俗记忆专业要点绑定规则。原创 2025-12-14 19:25:31 · 880 阅读 · 0 评论 -
大白话Proactor模式
Reactor处理IO就绪事件(“数据可以读了,你自己来拿”);Proactor处理IO完成事件(“数据已经给你读好了,你直接用”)。Proactor模式的核心是**“异步IO请求 → 操作系统完成IO → 处理完成结果”**,通俗易懂的讲就是:你只管“下单”(发起IO请求),剩下的交给别人做,做好了通知你“收货”(处理结果)。原生Proactor(Linux AIO)仅适用于文件IO;网络IO的Proactor需用“Reactor+线程池”模拟;原创 2025-12-13 18:50:12 · 930 阅读 · 0 评论 -
大白话Reactor模式
用epoll/select批量监控所有连接(经理盯面板);连接有事件才处理(顾客有需求才喊服务员);分工明确(迎宾管接客,点餐员管服务)。定义统一的接口(服务员手册);封装Reactor核心(经理),处理epoll的增删改查;实现Acceptor(迎宾)和Connection(点餐员),处理具体事件。实际项目中不用自己写全套(有成熟库如muduo、Asio),但理解这个模式,就能看懂Redis、Nginx这些高性能软件的底层逻辑了。原创 2025-12-13 18:32:58 · 882 阅读 · 0 评论 -
第20章_程序的执行_《深入理解Linux内核(第三版)》
ELF格式的核心地位:ELF是Linux的主流可执行格式,其程序头表、节头表、入口地址、操作系统标识是理解加载流程的基础,必须掌握“段与节的区别”“程序头表的作用”。可执行格式与执行域的协同:格式负责“解析文件”,执行域负责“兼容系统ABI”,二者结合实现“跨格式、跨系统”程序执行,这是Linux兼容设计的核心。execve系统调用的流程:从用户态封装到内核态解析、地址空间重建、入口设置,每一步的关键操作(如路径解析、权限检查、格式匹配)必须清晰,尤其是“地址空间替换”与“PID不变”的矛盾统一。原创 2025-11-23 18:24:24 · 55 阅读 · 0 评论 -
-o0、-o1、-o2、o3优化的差别
特性-O0(无优化)-O1(基础优化)-O2(充分优化)-O3(极致优化)核心目标快速编译,易于调试基本性能提升最佳性价比,平衡性能与编译时间极致性能编译速度非常快快较慢非常慢可执行文件大小大中小可能最大运行速度非常慢中快可能最快可调试性非常好一般差非常差内存占用 (编译时)低中高非常高风险无低低中等 (可能引入bug)适用场景开发/调试快速测试,对性能有一定要求生产环境默认计算密集型,已充分测试的代码。原创 2025-11-21 21:49:43 · 92 阅读 · 0 评论 -
C++14和C++17异同
总的来说,C++14 主要是对 C++11 的完善和优化,而 C++17 则是一次意义重大的更新,它带来了更多能够改变编程范式、提升代码质量和运行效率的特性。在实际项目中,如果条件允许(编译器等工具链支持),升级到 C++17 通常是值得的。你可以从使用处理可选值、用避免字符串拷贝、用结构化绑定处理多返回值等场景开始,逐步体验现代 C++ 带来的便利与强大。原创 2025-11-21 21:21:33 · 690 阅读 · 0 评论 -
进程间通信方式_复习
进程间通信的核心是“突破地址空间隔离”,不同IPC方式的差异本质是数据存储位置(内核/内存/网络)和同步机制的不同。实际开发中需根据“效率、可靠性、适用范围”选择合适的方式,同时注意资源清理(如删除消息队列、共享内存、信号量),避免系统资源泄漏。原创 2025-11-21 08:58:35 · 48 阅读 · 0 评论 -
第19章_进程通信_《深入理解Linux内核(第三版)》
资源持久化:IPC资源独立于进程生命周期,创建后需显式释放(进程退出不自动销毁),由内核统一管理。标识方式:通过“键值(key)”和“标识符(ID)”关联——键值是用户态进程创建/访问IPC资源的“索引”,标识符是内核分配的唯一标识(对应用户态可见的资源句柄)。权限控制:基于ipc_perm结构实现类文件权限(所有者、组、其他用户的读/写/执行权限),与文件系统权限模型兼容。IPC资源的“键值-标识符-权限”三重管理:理解ipc_perm。原创 2025-11-19 09:05:31 · 589 阅读 · 0 评论 -
Linux 系统下使用 C 语言实现的简单 TCP 服务器
上述代码只能处理一个客户端连接,处理完后程序就会退出。是 Linux 下最高效的 I/O 多路复用技术,适合处理高并发场景。原创 2025-11-17 23:23:29 · 862 阅读 · 0 评论 -
std::shared_ptr 为什么要计数?使用场景?
自动管理生命周期:无需手动调用deleteshared_ptr根据计数自动判断何时释放对象。安全共享所有权:多个指针可以放心地指向同一个对象,不用担心“谁该释放”“何时释放”的问题。避免双重释放和内存泄漏:计数为0时才释放对象,确保对象只被释放一次;只要有指针引用,对象就不会被提前释放。计数的目的通过引用计数,实现了“多个指针共享同一个对象”的安全管理,核心是解决双重释放和内存泄漏问题。核心场景:多线程共享对象、容器存储动态对象、复杂结构的循环引用(配合weak_ptr。原创 2025-11-16 22:06:53 · 877 阅读 · 0 评论 -
详解std::enable_shared_from_this
是一个工具,用于让一个已经被管理的对象能够安全地获取指向自身的。核心方法是,它返回一个与现有shared_ptr共享所有权的shared_ptr。核心原理是基类内部维护了一个weak_ptr,当第一个shared_ptr指向对象时,这个weak_ptr被初始化。就是通过来获取shared_ptr的。使用条件类必须公有继承。对象必须由管理。不要在构造函数中调用。典型应用场景需要将对象自身的指针作为参数传递给其他函数,同时希望延长对象的生命周期。在异步回调中,确保回调执行时对象仍然有效。原创 2025-11-16 22:00:36 · 807 阅读 · 0 评论 -
Fuzzing知识框架简单入门
C++ 模糊测试是发现深度漏洞的有效手段。从小开始:先用简单种子文件开始测试,逐步完善语料库。持续集成:将模糊测试集成到 CI/CD 流程中,实现持续的安全测试。多工具结合:不同模糊测试工具各有优势,可结合使用提高漏洞发现率。耐心等待:有效的模糊测试通常需要长时间运行(数小时甚至数天)。原创 2025-11-02 17:03:15 · 852 阅读 · 0 评论 -
上手Ubuntu上的 Ninja
特性NinjaMake设计哲学极简主义,做构建系统的“汇编器”功能丰富,支持条件判断、函数等复杂逻辑启动速度毫秒级,解析开销极小相对较慢,需要逐行解析 Makefile并行构建默认并行,且支持动态负载均衡需手动指定-j参数适用场景大型项目、需要高频快速构建中小型项目、需要复杂构建逻辑的场景总而言之,在 Ubuntu 上使用 Ninja 是一个提升 C/C++ 项目构建效率的简单而有效的策略。安装 → 使用生成构建文件 → 运行ninja命令执行构建。原创 2025-11-02 00:50:19 · 1068 阅读 · 0 评论 -
clang-format 知识框架简单介绍
掌握 Clang-Format 的核心在于理解其基于 AST 的工作原理,学会通过文件灵活配置风格,并将其无缝集成到编辑器和团队开发流程中。它是一个能显著提升代码质量和开发效率的实用工具。原创 2025-11-01 23:27:13 · 887 阅读 · 0 评论 -
clang-tidy知识框架简单介绍
Clang-Tidy 是一个基于 Clang 的 C/C++ 静态代码分析工具,它不仅能识别代码中的潜在问题、风格不符和可优化点,还能自动修复其中许多问题。-fix下面我们来详细探讨这个框架的各个部分。原创 2025-11-01 23:22:35 · 750 阅读 · 0 评论 -
std::unique_ptr的使用_复习
默认情况下,unique_ptr对单个对象用delete,对数组用delete[]。但有时需要管理其他类型的资源(如文件句柄、网络套接字),或自定义释放逻辑,此时需指定删除器(deleter)。删除器是一个可调用对象(函数、lambda、仿函数等),接收T*类型参数,负责释放资源。unique_ptr,第二个参数即删除器类型。文件句柄(FILE*)需用fclose释放,而非delete#include <cstdio> // 包含FILE、fopen、fclose等// 定义删除器:关闭文件句柄。原创 2025-10-29 09:04:23 · 625 阅读 · 0 评论 -
std::shared_ptr的使用_复习
shared_ptr默认用delete释放资源,但数组需要delete[],因此管理数组时必须指定自定义删除器。// 错误示例:默认删除器用 delete,数组会释放错误// 析构时行为未定义// 正确方式1:用 lambda 作为删除器(调用 delete[])delete[] p;std::cout << "数组已释放\n";});// 正确方式2:用 std::default_delete(标准删除器)return 0;C++20 简化:可直接用(自动用delete[]原创 2025-10-26 23:37:37 · 1022 阅读 · 0 评论 -
在多线程环境中,如果析构函数需要执行可能失败的操作,应该如何设计才能保证线程安全和异常安全?
线程安全:用mutex同步所有资源访问,shared_ptr管理生命周期。异常安全:析构函数捕获所有异常,用标志位避免重复操作。核心思想:让析构函数“安静地失败”(记录错误不抛异常),同时通过同步机制防止多线程冲突。原创 2025-10-26 22:52:23 · 286 阅读 · 0 评论 -
volatile和atomic的区别_复习
特性volatileatomic核心目标禁止编译器优化,确保内存可见性保证操作原子性,解决多线程竞争原子性保证不保证(复合操作可能被打断)保证(读写、自增等操作是原子的)内存可见性仅保证不缓存到寄存器(硬件层面可见)隐含内存屏障(多线程间可见)适用场景硬件交互、中断、信号处理多线程共享变量的并发访问能否替代对方不能替代atomic(无原子性)不能替代volatile(不处理编译器优化)volatile的核心。原创 2025-10-26 19:03:04 · 1297 阅读 · 0 评论 -
const和constexpr的区别_复习
特性constconstexpr初始化时机可在运行时或编译期必须在编译期(依赖常量表达式)核心目标保证“只读”(运行时不被修改)保证“编译期可计算”(值在编译期确定)适用对象变量、函数参数、成员函数等变量、函数、构造函数能否用于编译期语境不一定(若值在运行时确定则不能)一定可以(值在编译期确定)const的核心:“只读”,保证变量初始化后不被修改,初始化时机可以是运行时或编译期。constexpr的核心:“编译期可计算”,变量或函数的结果必须在编译期确定,初始化只能依赖常量表达式。原创 2025-10-26 18:51:56 · 808 阅读 · 0 评论 -
为什么在构造函数和析构函数中调用虚函数不会发生多态?请从vptr的初始化时机解释
构造/析构函数中调用虚函数无多态,本质是vptr的指向与构造/析构顺序强绑定构造时:vptr先指向基类vtable(基类构造阶段),后升级为派生类vtable(派生类构造阶段)。基类构造内无法访问派生类vtable,派生类构造内调用自身虚函数也非多态。析构时:vptr先保持派生类vtable(派生类析构阶段),后降级为基类vtable(基类析构阶段)。基类析构内无法访问派生类vtable,因此无多态。简言之,原创 2025-10-26 18:29:32 · 955 阅读 · 0 评论 -
C++ 变量的存储位置
栈 vs 堆:栈自动管理(速度快、空间小),堆手动管理(空间大、易泄漏)。全局/静态区 vs 常量区:前者可修改(如g_init),后者只读(如g_const、字符串常量)。局部静态变量:作用域局部,但生命周期全局,存储在全局/静态区。指针的存储:指针变量本身的位置由其定义方式决定(局部指针在栈,全局指针在全局区),而指针指向的内容位置由分配方式决定(new分配在堆,字符串常量在常量区)。原创 2025-10-26 17:32:01 · 718 阅读 · 0 评论 -
C++继承构造函数
继承构造函数是C++11引入的实用特性,核心价值是简化派生类对基类构造函数的复用,减少代码冗余。语法:通过using 基类::基类;声明;范围:不继承拷贝/移动构造函数;派生类成员:继承的构造函数默认初始化额外成员;冲突处理:派生类自定义构造函数会覆盖同名参数的继承版本;多继承:需避免不同基类构造函数的参数歧义。继承构造函数的核心价值是简化派生类对基类构造逻辑的复用,但并非所有场景都适用。下面结合具体场景和代码示例,详解其典型使用场景及适用条件。原创 2025-10-16 23:06:23 · 438 阅读 · 0 评论 -
如何采集声音-模数转换原理
模拟信号是连续的,而计算机只能处理离散的数字信号(0和1)。这就像用相机进行高速连拍,将连续的动作分解为一连串的静态照片。采样得到的样本点在幅度(振幅)上仍然是连续值。量化就是将这些连续的幅度值“四舍五入”到有限个离散的等级上,使其能够用数字表示。编码是将量化后的一系列离散的整数值,按照一定的格式转换为二进制码流(由0和1组成)的过程。采集声音的第一步,是用麦克风(学名“传声器”)将这种物理振动转换成连续的。经过PCM编码后得到的数据,就是最原始的数字化音频数据,常被称为PCM音频数据。原创 2025-10-08 18:44:35 · 1055 阅读 · 0 评论 -
C++ 委托构造函数
委托构造函数通过构造函数间调用链将分散的初始化逻辑集中化,显著提升代码的简洁性和可维护性。适用场景:多构造函数共享初始化逻辑、链式初始化、结合继承。核心规则:初始化列表仅能委托一个目标构造,执行顺序由被委托构造到委托构造。规避陷阱:循环委托、资源初始化冲突、异常安全。原创 2025-10-08 15:44:45 · 1305 阅读 · 0 评论 -
C++ 的 Armadillo 线性代数库
Armadillo 是一个用于 C++ 的高性能线性代数库(矩阵和向量运算)。语法接近 Matlab/Octave:让熟悉 Matlab 的用户能快速上手,代码可读性高。高性能:它本身是一个“薄封装”,在底层调用高度优化的 BLAS (Basic Linear Algebra Subprograms) 和 LAPACK (Linear Algebra Package) 库,因此能获得接近 Fortran 的计算速度。易用性。原创 2025-10-06 21:44:07 · 1024 阅读 · 0 评论 -
手写scoped_thread
RAII 是核心的本质是利用 C++ 对象的生命周期来自动管理的资源(即线程的join代码健壮性:它从根本上杜绝了因忘记join或在异常路径中漏掉join而导致程序崩溃的风险。设计要点私有成员。可变参数模板构造函数 + 完美转发,保证易用性。禁止拷贝,确保资源独占。默认移动,允许所有权转移。析构函数中检查joinable()并调用join()。注意事项的析构函数会阻塞当前线程,直到其所管理的线程执行完毕。这是join()的特性。如果不希望阻塞,你应该在析构前手动调用。原创 2025-10-04 14:35:41 · 699 阅读 · 0 评论 -
std::apply
std::apply是一个强大而优雅的工具,它填补了std::tuple和函数调用之间的空白。通过理解它的工作原理(利用在编译期解包),你不仅能更好地使用它,还能学到现代 C++ 模板元编程的核心技巧。在处理需要将打包参数传递给函数的场景时,std::apply应该是你的首选。原创 2025-10-04 13:25:40 · 873 阅读 · 0 评论 -
第三章_GDB Commands_《Debugging with gdb》
模块核心重难点关键命令/操作常见误区命令语法命令缩写(无歧义)、空白行重复例外、#注释b(break缩写)、Ctrl-o缩写s代表show、空白行重复run命令设置with临时生效、setshow对应忘记--分隔符、with仅用于print命令补全TAB三级补全、C++模板需单引号、补全模板忘单引号、认为补全仅支持命令文件名引用两类命令的文件名处理(转义/不转义)所有命令都转义、数字开头文件名被当PID命令选项--分隔选项与参数、布尔选项取值忽略--、布尔选项缩写(如y代yes获取帮助。原创 2025-09-25 09:11:41 · 762 阅读 · 0 评论 -
C++知识体系
是C++的特色和难点,也是区分程序员水平的一道坎。可能是高性能计算、游戏引擎、嵌入式系统,或者是分布式后端。是编写更安全、更高效、更简洁代码的关键,尤其是智能指针,它几乎是现代C++内存管理的标配,能有效避免内存泄漏。是唯一途径,从简单的“Hello World”到实现一个小型管理系统,都能极大提升你的理解和熟练度。是现代C++开发的利器,能极大提高开发效率和代码质量,一定要熟练使用其常用容器和算法。面向对象编程是C++的核心思想,一定要理解其精髓(封装、继承、多态),而不仅仅是语法。原创 2025-09-23 22:56:26 · 675 阅读 · 0 评论 -
MCU知识体系
MCU(微控制器单元,俗称单片机)是嵌入式系统的核心。为了帮助你系统地掌握从入门到精通所需的知识,我为你整理了一个详细的知识体系表格,并附上了一些学习建议。原创 2025-09-23 22:28:53 · 396 阅读 · 0 评论 -
DTS和PTS
理解 DTS(Decoding Time Stamp,解码时间戳)和 PTS(Presentation Time Stamp,显示时间戳)对音视频开发至关重要。它们像是给每一帧数据贴上的“时间标签”,指导解码器和播放器在正确的时间做正确的事,确保音画同步。我会一步步为你解释清楚。原创 2025-09-20 21:59:10 · 825 阅读 · 0 评论 -
cpp返回值优化
构造函数/析构函数的调用时机。当NRVO因多个返回路径而可能失效时,移动构造函数如何作为一种高效的备选方案。返回值优化(RVO/NRVO)如何默默地提升性能。原创 2025-09-12 08:35:02 · 939 阅读 · 0 评论 -
arma::imat22
是中定义的一个。它主要用于处理小型、维度在编译时已知的整数矩阵,因其在栈上分配内存,故通常比动态矩阵有更高的效率。下面是一个汇总了intfill::onesfill::eyeoperator().print().t()==!.*下面是关于的详细解释和可执行代码示例。原创 2025-09-06 00:31:45 · 505 阅读 · 0 评论 -
std::complex
std::complex 是 C++ 标准库中用于处理复数的模板类,主要定义在。它非常适合进行科学计算、信号处理等领域所需的复数运算。如果你在特定的运算或应用场景中遇到问题,欢迎提出!希望这个详细的示例和解释能帮助你更好地理解和使用。下面我们通过一个可执行的示例程序来详细了解。原创 2025-09-05 23:34:49 · 232 阅读 · 0 评论 -
C++ `inline`函数细究
机制,通过将函数体直接插入调用点,消除函数调用的开销(参数压栈、跳转指令、栈帧管理)。指令,执行流程跳转至函数地址;,结合现代C++特性实现安全高效的零开销抽象。,仅对已验证的热点函数显式使用。强制编译时内联计算,替代部分。原创 2025-08-28 08:50:12 · 891 阅读 · 0 评论
分享