- 博客(63)
- 资源 (1)
- 收藏
- 关注
原创 C++字符串与‘/0’
判断规则:你这块字符内存,使用者(函数)是靠【\0】判断结束,还是靠【显式传入的长度】判断结束。如果函数没有长度参数,仅接收 char* →必须保证末尾带\0典型:strlen、strcpy、strcmp、printf ("% s")、puts、C 风格 SDK 字符串入参。如果函数同时接收 char* + size_t 长度→不需要\0,按长度处理内存。std::string:内部靠 size,你不用手动加\0;.c_str()自动补齐。
2026-09-20 16:10:20
140
原创 C函数调用压栈过程详解
push 3;push2;push1从右往左压入实参call func→ push返回地址,跳funcpush ebp;建立栈帧sub esp,12开辟var1/var2/var3局部变量空间func:把入参拷贝给局部变量var1 var2 var3func:准备printf参数,call printf,调用方平衡printf栈设置返回值pop ebp;ret销毁栈帧,回到mainmain:接收eax返回值给result,add esp,12清理func的参数栈。
2026-09-01 09:53:52
310
原创 C++项目如何架构优化
优先级优化措施预期效果🔴最高前向声明代替不必要的#include立竿见影🔴最高检查头文件依赖图,消除循环依赖解决编译死循环🟡高PIMPL 惯用法(核心接口类)大幅减少传播编译🟡高拆分过大的头文件减少不必要的依赖🟢中将非内联函数移到.cpp中等收益🟢中使用预编译头(PCH)基础设施优化🔵长期引入 C++20 模块架构级变革。
2026-08-13 20:12:36
363
原创 Harris角点检测
特征值可以理解为矩阵在各个主轴方向上的“拉伸/压缩倍率”。正定矩阵意味着无论你在哪个方向上取向量,它经过矩阵变换。这就要求矩阵在所有方向上都必须是“拉伸”的(倍率>0),而不能有任何方向的“翻转”(否则就会出现负值)。的夹角始终小于90度(即做正功,产生正向投影),即。,其对应的二次型矩阵为。
2026-07-27 08:24:03
171
原创 STL之容器比较
需要随机访问、频繁遍历 →vector需要头尾快速增删、偶尔随机访问 →deque大量中间插入删除、很少遍历查找 →list(谨慎)固定大小数组 →array需要有序、范围查找、自动排序去重 →map / set只需要快速查找,不要求顺序 →。
2026-07-24 16:04:24
200
原创 STL之deque
两端插入删除不需要移动大量元素vector 头插要把所有元素后移;deque 仅操作独立数据块,中间元素完全不动;内存分配粒度小、代价低 新增元素只分配一小块 buffer,不会像 vector 那样一次性申请超大连续内存;释放也是按块归还;map 扩容成本极低 map 只存指针,扩容时拷贝一堆 8 字节指针,对比 vector 拷贝所有对象,开销可以忽略;均摊时间复杂度 O (1) 绝大多数两端操作直接复用现有块空闲空间,只有块耗尽时才触发一次小块分配,无线性拷贝。deque 采用。
2026-07-20 11:06:48
164
原创 STL之list
/ 声明// 空int链表// 10个"abc"节点// 初始化列表// 拷贝构造链表任意位置插入、删除均摊 O (1),无需移动大量元素;迭代器稳定性极强,增删几乎不失效;splice 可零开销转移整片节点;头尾操作效率一致,不像 vector 头插代价极高。
2026-07-20 10:46:54
240
原创 STL之Vector
是一个连续存储的动态数组,位于头文件<vector>中,属于 C++ 标准模板库(STL)的序列式容器。是连续内存、动态扩容的顺序容器内部通过管理内存扩容代价高,推荐提前reserve适合大多数“数组型”需求vector= 连续内存 + 自动扩容的动态数组。
2026-07-20 10:33:42
196
原创 C++ NRVO
NRVO(Named Return Value Optimization,具名返回值优化)是 C++ 中一种编译器优化技术,旨在消除函数返回对象时产生的临时对象和多余的拷贝操作。它是 RVO(Return Value Optimization,返回值优化)的一种特例,专门处理返回"具名变量"(即有名字的局部变量)的场景。
2026-06-24 20:09:52
221
原创 工厂方法与抽象工厂
核心差异:工厂方法聚焦「单一产品」的创建,抽象工厂聚焦「一组相关产品(产品族)」的创建;接口设计:工厂方法的抽象工厂只有一个创建方法,抽象工厂的抽象工厂有多个创建方法(对应多个产品等级);扩展性:工厂方法新增产品只需新增具体工厂,抽象工厂新增产品族易,但新增产品等级需修改抽象工厂接口(违反开闭原则)。
2026-03-05 09:45:31
223
原创 设计模式-备忘录模式
备忘录模式的核心是封装保存对象状态,实现状态的保存与恢复,且不破坏对象封装性;C++ 实现时,通过友元 / 私有构造函数保证备忘录的状态仅被原发器访问,管理者仅做存储管理;优点是状态回滚方便、封装性好,缺点是频繁保存会增加内存开销,适合存档、撤销等场景。
2026-02-28 08:56:46
284
原创 设计模式-中介模式
中介者模式的核心是用中介者封装对象间的交互,让对象只和中介者通信,解耦对象;C++ 实现时,同事类需持有中介者指针,中介者管理所有同事并实现交互逻辑;优点是解耦、集中管理交互,缺点是中介者可能过度复杂,需权衡使用。
2026-02-27 15:57:03
365
原创 设计模式-状态模式
状态模式的核心是封装状态、委托行为,将状态的行为和切换逻辑从上下文剥离到独立的状态类中;C++ 中通过抽象状态基类 + 多态实现,上下文仅持有当前状态引用,符合 “单一职责原则” 和 “开闭原则”;优势是消除大量状态判断分支、状态逻辑可复用、新增状态无需修改原有代码;缺点是状态较多时会增加类的数量,简单状态场景下略显繁琐。
2026-02-27 11:03:57
283
原创 设计模式-责任链模式
责任链模式的核心是请求链式传递、处理者自主决策,将请求的发送者和处理者解耦;C++ 中通过抽象处理者基类 + 多态实现,每个处理者只需关注自身职责,符合 “单一职责原则”;优势是可动态调整链条结构、扩展性强(新增处理者只需继承抽象类);缺点是请求可能遍历整个链仍未被处理(需做好链尾兜底),且调试时链条过长可能增加复杂度。
2026-02-27 10:32:51
389
原创 设计模式-命令模式
命令模式通过将请求(包括接收者对象及执行操作所需的所有信息)封装成独立的对象,使请求的发送者(Invoker)不需要了解具体的接收者(Receiver)或如何执行请求。命令模式(Command Pattern)是一种行为型设计模式,它将一个请求封装为一个对象,从而允许用户使用不同的请求、队列或日志来参数化其他对象,同时支持请求的撤销操作。下面是一个简单的例子:模拟一个遥控器(Invoker)控制电灯(Receiver)的开关。实际执行操作的对象。命令对象调用接收者的方法来完成具体的业务逻辑。
2026-02-27 10:18:57
342
原创 设计模式-模板方法
在父类中定义一个算法的骨架(模板方法),将算法中可变的步骤延迟到子类中实现。泡一杯饮料的通用流程(骨架):烧开水 → 冲泡原料 → 倒入杯子 → 加辅料。其中 “烧开水、倒入杯子” 是固定步骤,“冲泡原料(茶 / 咖啡)、加辅料(糖 / 奶)” 是可变步骤。父类(饮料类)定义整个流程的模板方法,子类(茶类、咖啡类)只需要实现自己的可变步骤即可。抽象类(Abstract Class)定义模板方法:包含算法的骨架,按固定顺序调用各个步骤。
2026-02-27 09:44:55
390
原创 设计模式-组合模式
组合模式的核心是统一叶子节点和组合节点的接口,让客户端以相同方式处理单个对象和组合对象;C++ 实现的关键是:抽象组件定义公共接口,叶子节点实现基础功能,组合节点递归管理子节点;组合模式的核心价值是简化树形结构的操作,降低客户端与复杂层级结构的耦合度,符合 “开闭原则”(新增节点类型无需修改客户端)。
2026-02-26 20:09:06
293
原创 设计模式-享元模式
享元模式的核心是分离内部状态(可共享)和外部状态(不可共享),通过工厂管理共享对象池,减少重复对象创建;C++ 实现的关键是:用工厂类维护享元池,使用智能指针(如shared_ptr)管理对象生命周期,避免内存泄漏;享元模式的核心价值是节省内存、提升性能,适用于大量细粒度相似对象的场景(如游戏资源、字符渲染、连接池)。
2026-02-26 19:59:43
315
原创 设计模式——访问者模式
访问者模式的核心是分离数据结构和操作,通过 “接受 - 访问” 的双重分派机制实现对不同元素的差异化操作。C++ 实现的关键是:抽象元素定义accept接口,抽象访问者为每个具体元素定义visit接口,具体元素调用访问者的对应visit方法。适用场景是 “数据结构固定、操作频繁变化”,缺点是新增元素类型时成本高,需权衡使用。
2026-02-12 20:07:10
970
原创 c++ CRTP模式详解
CRTP(Curiously Recurring Template Pattern,奇异递归模板模式)是C++中一种高级的模板编程技术,它通过将派生类作为基类的模板参数来实现编译期多态。CRTP是C++模板元编程中的强大工具,它通过编译期多态提供了零开销的抽象能力。记住CRTP的核心思想:基类通过static_cast将this指针转换为派生类指针,从而调用派生类的方法,所有这一切都在编译期完成。// 编译时检查:确保Derived是从Base<Derived>派生的。// Mixin:为类添加功能。
2026-02-10 09:31:25
1039
原创 弧长参数化
设空间曲线的普通参数方程为 r(t)=(x(t),y(t),z(t))(平面曲线为 z(t)=0),t∈[a,b],且 r′(t) 连续、非零(正则曲线),则从 t=t0 到 t=t 的弧长定义为:其中 ∥r′(τ)∥=x′(τ)2+y′(τ)2+z′(τ)2 是曲线的切向量的模长(也叫速率,对应参数 t 变化时的曲线移动速度)。若能将曲线表示为以弧长为参数参数 s 是从曲线定点 r(0) 出发的弧长;对任意 s1<s2,有 ∫s1s2∥r′(σ)∥dσ=s2−s1。
2026-01-30 20:27:03
776
原创 参数化曲线弧长公式推导
本文通过微元法推导了参数化曲线的弧长公式。首先定义二维参数曲线方程,利用微元增量求得x、y方向的变化量,通过勾股定理得到弧长微元ds的表达式。将微元积分得到总弧长公式L=∫√(x'(t)²+y'(t)²)dt。最后将结论推广到三维情况,给出三维参数曲线的弧长公式。推导过程展现了如何将曲线分割为无穷小微元,用直线近似弧长,再通过积分求和的数学思想。
2026-01-17 21:25:15
319
原创 消息循环过程
2. 窗口设置了 WS_EX_NOPARENTNOTIFY 扩展样式:子控件不会向父窗口发送 WM_PARENTNOTIFY 消息,父窗口无法感知子控件的鼠标事件。1. 检查当前窗口类的消息映射表(由 BEGIN_MESSAGE_MAP/END_MESSAGE_MAP 定义),根据消息类型查找对应的处理函数;1. 用户代码未调用基类函数:子控件或窗口的处理函数中省略 CWnd::OnXXX 调用,消息会被截断,不再传递给父窗口;
2026-01-15 08:03:32
279
原创 设计模式-中介者模式
核心作用:中介者模式通过引入统一的中介对象,封装多个对象间的交互,降低对象间的直接耦合,让交互逻辑集中管理。核心结构:抽象中介者(定义接口)→ 具体中介者(实现协调逻辑);抽象同事(持有中介者)→ 具体同事(通过中介者交互)。适用场景:多个对象间存在复杂的交互关系(如聊天室、GUI 组件交互、分布式系统协调),且希望降低对象间耦合时。这个模式的核心思想是「化繁为简」—— 把多对多的复杂交互,转化为同事与中介者之间的一对多交互,是解耦复杂系统的重要手段。
2026-01-07 19:44:19
689
原创 设计模式-适配器模式
核心作用:适配器模式解决「接口不兼容」问题,让原本无法协作的类可以一起工作,核心是「接口转换」。实现方式推荐使用对象适配器(组合方式),耦合度低、灵活性高;类适配器(继承方式)仅适用于简单场景,依赖多继承,扩展性差。应用场景:集成第三方库(接口固定)、复用已有旧代码(接口不匹配)、统一多个类的对外接口等。类适配器模式的优缺点是什么?除了对象适配器模式,还有哪些常见的适配器模式?如何在实际项目中选择使用适配器模式?
2026-01-07 19:18:09
486
原创 设计模式-代理模式
是一种结构型设计模式,为其他对象提供一种代理以控制对这个对象的访问。:虚拟代理可以延迟加载,缓存代理可以减少重复计算。:可以在不修改真实主题的情况下增加功能。:保护代理可以控制对真实主题的访问权限。:真实主题只需关注核心业务逻辑。延迟目标对象的创建和初始化。控制对目标对象的访问。
2026-01-07 19:04:21
470
原创 设计模式-原型模式
在一款 RPG 游戏中,需要生成大量同类型但属性略有差异的怪物(比如 “哥布林”“兽人”)。每个怪物包含基础属性(血量、攻击力)、技能列表、装备列表等复杂数据,直接通过构造函数创建会重复加载资源(如技能配置、装备模型),性能开销大。使用原型模式:先创建一个 “原型怪物”(加载好所有基础资源),后续新怪物都通过克隆原型生成,仅修改少量差异化属性(如血量、位置)。
2026-01-06 12:38:21
501
原创 设计模式-桥接模式
/ 实现化(Implementor):颜色接口(纯虚类)public:// 纯虚函数:获取颜色名称// 虚析构函数:确保子类析构正常// 抽象化(Abstraction):图形抽象类protected:// 持有实现化对象的指针(桥接核心:连接形状和颜色)public:// 构造函数:注入颜色对象");// 纯虚函数:绘制图形(由子类实现)// 虚析构函数:释放颜色对象// 禁用拷贝构造和赋值(避免浅拷贝导致重复释放)// 移动构造和赋值(可选,提升性能)
2026-01-06 10:38:20
885
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅