<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[doubleintfloat的博客]]></title><description><![CDATA[记录与分享技术成长道路上的点滴]]></description><link>https://blog.csdn.net/doubleintfloat</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; doubleintfloat]]></copyright><item><title><![CDATA[STL stack为何没有迭代器]]></title><link>https://blog.csdn.net/doubleintfloat/article/details/163054721</link><guid>https://blog.csdn.net/doubleintfloat/article/details/163054721</guid><author>doubleintfloat</author><pubDate>Mon, 20 Jul 2026 21:10:35 +0800</pubDate><description><![CDATA[C++ STL 的 std::stack 不提供迭代器，因为它是一个容器适配器，设计初衷是严格遵循栈的后进先出（LIFO）原则，仅允许操作栈顶元素。作为底层容器（如 deque 或 vector）的封装，stack 屏蔽了遍历接口（begin()/end()），以防止破坏栈的语义和封装性。若需遍历，可通过临时拷贝底层容器或逐个出栈缓存实现。类似地，queue 和 priority_queue 也不支持迭代器，以维护各自数据结构的行为约束。]]></description><category></category></item><item><title><![CDATA[简单工厂模式、工厂模式、抽象工厂模式区别]]></title><link>https://blog.csdn.net/doubleintfloat/article/details/162740573</link><guid>https://blog.csdn.net/doubleintfloat/article/details/162740573</guid><author>doubleintfloat</author><pubDate>Thu, 09 Jul 2026 23:58:25 +0800</pubDate><description><![CDATA[本文对比了工厂家族的三种设计模式：简单工厂、工厂方法和抽象工厂。简单工厂通过一个工厂类集中创建所有产品，适合产品类型少且稳定的场景，但违反开闭原则；工厂方法模式为每个产品创建独立工厂，扩展性强但类数量多；抽象工厂用于生产配套产品族，保证组件一致性，但新增功能需修改所有工厂。三者核心区别在于工厂数量、产品类型和扩展性，适用于不同业务场景。简单工厂适合简单工具类，工厂方法适合频繁新增产品的系统，抽象工厂则适用于需要成套组件的复杂系统。]]></description><category></category></item><item><title><![CDATA[代理模式和适配器模式区别]]></title><link>https://blog.csdn.net/doubleintfloat/article/details/162740266</link><guid>https://blog.csdn.net/doubleintfloat/article/details/162740266</guid><author>doubleintfloat</author><pubDate>Thu, 09 Jul 2026 23:16:02 +0800</pubDate><description><![CDATA[代理模式与适配器模式的核心区别 代理模式与适配器模式虽然都是结构型设计模式，但核心目的不同： 适配器模式（Adapter） 作用：接口转换，解决兼容问题 特点：提供新接口，抹平新旧/第三方接口差异 类比：转换插头 适用场景：整合第三方SDK、新旧系统兼容 代理模式（Proxy） 作用：功能增强，控制访问 特点：保持完全相同接口，透明调用 类比：中介/经纪人 适用场景：缓存、日志、权限控制、延迟加载 关键区分点：接口是否改变 接口不同 → 适配器 接口相同 → 代理 记忆口诀： "接口不一样用适配器，接口一样]]></description><category></category></item><item><title><![CDATA[建造者模式和模板方法模式的区别]]></title><link>https://blog.csdn.net/doubleintfloat/article/details/162740040</link><guid>https://blog.csdn.net/doubleintfloat/article/details/162740040</guid><author>doubleintfloat</author><pubDate>Thu, 09 Jul 2026 22:51:22 +0800</pubDate><description><![CDATA[摘要：模板方法模式与建造者模式的核心区别在于：模板方法通过父类固定算法流程（如饮品制作步骤），子类仅能重写具体步骤但不可调整顺序，侧重流程复用；建造者则将复杂对象（如电脑）的构建拆分为独立部件，通过导演类灵活控制组装顺序，支持部件替换，侧重分步构建。前者产出行为结果，后者生成复合对象；前者用继承维护流程，后者用组合分离构建逻辑。选型口诀：固定流程选模板方法，灵活组装选建造者。（149字）]]></description><category></category></item><item><title><![CDATA[深度对比简单工厂模式和策略模式]]></title><link>https://blog.csdn.net/doubleintfloat/article/details/162707410</link><guid>https://blog.csdn.net/doubleintfloat/article/details/162707410</guid><author>doubleintfloat</author><pubDate>Wed, 08 Jul 2026 23:06:58 +0800</pubDate><description><![CDATA[文章摘要 本文深入对比了简单工厂模式与策略模式的本质区别，澄清了两种模式在UML结构相似但设计目标完全不同的误区。简单工厂模式核心是封装对象创建过程，解决产品实例化复杂问题；而策略模式重点在于解耦算法与业务，支持运行时动态切换行为。关键差异包括：设计目标（创建vs使用）、主控角色（工厂vs上下文）、实例创建权归属（工厂全权vs客户端手动），以及开闭原则支持度。文章通过计算器支付场景示例，直观展示两种模式的应用差异，并提供了组合使用策略模式与简单工厂的优化方案。最后附上C++策略模式实战代码，演示商场收银系统]]></description><category></category></item><item><title><![CDATA[C++ 虚继承对象内存布局]]></title><link>https://blog.csdn.net/doubleintfloat/article/details/162530481</link><guid>https://blog.csdn.net/doubleintfloat/article/details/162530481</guid><author>doubleintfloat</author><pubDate>Fri, 03 Jul 2026 00:24:55 +0800</pubDate><description><![CDATA[摘要：本文详细解析了C++虚继承的内存布局机制。虚继承通过虚基表指针(vbptr)和虚基表(vbtable)实现共享虚基类，解决菱形继承的二义性问题。关键点包括：1)虚基类子对象始终位于派生类内存末尾；2)每个虚继承类含有一个vbptr指向偏移量表；3)与虚函数表指针(vptr)的区别；4)32/64位系统的布局差异。文章通过代码示例展示了简单虚继承和菱形继承的内存结构，并总结了构造顺序、访问规则等面试常见考点。虚继承以指针空间和间接访问为代价，消除了数据冗余。]]></description><category></category></item><item><title><![CDATA[C++ 类编译器默认生成的十大特殊成员函数]]></title><link>https://blog.csdn.net/doubleintfloat/article/details/162530126</link><guid>https://blog.csdn.net/doubleintfloat/article/details/162530126</guid><author>doubleintfloat</author><pubDate>Thu, 02 Jul 2026 23:40:47 +0800</pubDate><description><![CDATA[本文详细介绍了C++类中编译器默认生成的6个特殊成员函数（默认构造、拷贝构造、拷贝赋值、析构、移动构造、移动赋值）及其生成规则，并补充了4个未被列入特殊成员但会被隐式生成的运算符函数（取地址运算符及其const版本）。文章重点解析了各函数的生成条件、不生成场景和禁用情况，强调了三/五法则的重要性，即当需要自定义其中任一资源管理函数时，应显式定义或禁用全套相关函数。同时指出，虽然取地址运算符会被默认生成，但由于其不属于特殊成员且极少需要重载，通常不列入默认生成函数清单。]]></description><category></category></item><item><title><![CDATA[C++模板]]></title><link>https://blog.csdn.net/doubleintfloat/article/details/162498509</link><guid>https://blog.csdn.net/doubleintfloat/article/details/162498509</guid><author>doubleintfloat</author><pubDate>Wed, 01 Jul 2026 23:45:36 +0800</pubDate><description><![CDATA[本文摘要（148字）： C++模板是泛型编程的核心技术，包含函数模板和类模板两种形式。模板通过类型参数和非类型参数实现代码复用，编译器在使用时进行实例化生成具体代码。函数模板支持参数自动推导，而类模板需要显式指定类型。模板特化分为全特化（完全指定类型）和偏特化（部分指定），可针对特定类型优化实现。模板函数与普通函数可构成重载，匹配优先级为普通函数>模板函数。模板广泛应用于容器、算法等场景，能显著减少重复代码，提高开发效率。]]></description><category></category></item><item><title><![CDATA[结构体对齐]]></title><link>https://blog.csdn.net/doubleintfloat/article/details/162432814</link><guid>https://blog.csdn.net/doubleintfloat/article/details/162432814</guid><author>doubleintfloat</author><pubDate>Tue, 30 Jun 2026 00:33:57 +0800</pubDate><description><![CDATA[文章摘要：C/C++结构体内存对齐遵循四大核心原则：1)成员起始地址必须是对齐模数的整数倍；2)成员按声明顺序排列；3)结构体总大小需为对齐单位的整数倍；4)#pragma pack(n)可手动调整对齐。通过示例分析说明，当pack值≥成员大小时不会改变默认对齐行为，只有pack值小于成员大小时才会压缩内存。例如int在pack(16)下仍保持4字节对齐，结构体大小保持8字节；而pack(1)会取消填充使大小变为7字节。理解这些规则对优化内存布局至关重要。（150字）]]></description><category></category></item><item><title><![CDATA[const int *]]></title><link>https://blog.csdn.net/doubleintfloat/article/details/162431712</link><guid>https://blog.csdn.net/doubleintfloat/article/details/162431712</guid><author>doubleintfloat</author><pubDate>Mon, 29 Jun 2026 22:17:10 +0800</pubDate><description><![CDATA[这篇文章通俗易懂地拆解了C++指针和引用的类型转换问题。核心要点是： 当普通指针int*试图转换为常量指针const int*时会产生临时对象，而普通引用T&不能绑定临时对象（右值），导致编译错误。 提供了两个合法解决方案： 将引用改为常量引用const T&（允许绑定临时对象） 确保被引用对象本身就是目标类型（避免类型转换） 通过钥匙的比喻形象说明了问题本质：普通引用只能给长期存在的实物起别名，不能给临时创建的副本起别名。 最后用数字示例进一步验证了"普通引用不能绑定临时右值"这一核心规则。]]></description><category></category></item><item><title><![CDATA[C++引用初始化和赋值]]></title><link>https://blog.csdn.net/doubleintfloat/article/details/162431407</link><guid>https://blog.csdn.net/doubleintfloat/article/details/162431407</guid><author>doubleintfloat</author><pubDate>Mon, 29 Jun 2026 21:49:38 +0800</pubDate><description><![CDATA[摘要：C++引用两大核心规则：1)引用必须在定义时初始化，不能为空；2)引用绑定后不能改变目标。引用本质是变量的别名，不是独立变量。与指针不同，指针可空且能改变指向，而引用必须绑定具体变量且终身不变。常见误区包括误以为赋值会改变引用绑定、函数参数引用等场景。关键要理解引用只是给已有变量起别名，所有操作都作用于原变量而非引用本身。]]></description><category></category></item><item><title><![CDATA[本地验证http服务器拉取文件]]></title><link>https://blog.csdn.net/doubleintfloat/article/details/161604501</link><guid>https://blog.csdn.net/doubleintfloat/article/details/161604501</guid><author>doubleintfloat</author><pubDate>Tue, 02 Jun 2026 01:43:02 +0800</pubDate><description><![CDATA[没问题！我一次性给你两套。]]></description><category></category></item><item><title><![CDATA[Vue3启动流程和文件结构]]></title><link>https://blog.csdn.net/doubleintfloat/article/details/159786062</link><guid>https://blog.csdn.net/doubleintfloat/article/details/159786062</guid><author>doubleintfloat</author><pubDate>Fri, 03 Apr 2026 09:57:13 +0800</pubDate><description><![CDATA[Vue3 项目目录结构解析 📦 项目根目录 ├── 📂 public/ # 静态资源目录 │ └── index.html # 应用入口HTML文件 ├── 📂 src/ # 核心源码目录 │ ├── main.js # 应用入口文件 │ ├── App.vue # 根组件 │ ├── 📂 router/ # 路由配置 │ │ └── index.js # 路由定义文件 │ ├── 📂 views/ # 页面级组件 │ ├── 📂 components/ # 公共组件 │ ├── 📂 asse]]></description><category></category></item><item><title><![CDATA[C++执行指令，接收数据]]></title><link>https://blog.csdn.net/doubleintfloat/article/details/159159617</link><guid>https://blog.csdn.net/doubleintfloat/article/details/159159617</guid><author>doubleintfloat</author><pubDate>Tue, 17 Mar 2026 11:34:46 +0800</pubDate><description><![CDATA[【代码】C++执行指令，接收数据。]]></description><category></category></item><item><title><![CDATA[python自启动exe]]></title><link>https://blog.csdn.net/doubleintfloat/article/details/159127832</link><guid>https://blog.csdn.net/doubleintfloat/article/details/159127832</guid><author>doubleintfloat</author><pubDate>Mon, 16 Mar 2026 18:28:38 +0800</pubDate><description><![CDATA[这段Python代码实现了一个检测并自动启动指定exe程序的功能。主要使用psutil库检测进程是否存在，如果未运行则通过subprocess启动程序。代码包含错误处理机制，能处理进程访问权限问题、程序路径不存在等情况。使用示例中演示了如何指定目标exe路径并调用检测启动函数。该脚本适合用于监控关键应用程序的运行状态并确保其持续运行。]]></description><category></category></item><item><title><![CDATA[卷帘快门，全局快门]]></title><link>https://blog.csdn.net/doubleintfloat/article/details/158572995</link><guid>https://blog.csdn.net/doubleintfloat/article/details/158572995</guid><author>doubleintfloat</author><pubDate>Mon, 02 Mar 2026 11:48:42 +0800</pubDate><description><![CDATA[卷帘快门：逐行先后曝光 → 会果冻、会频闪、便宜好用。全局快门：整幅同时曝光 → 不果冻、不频闪、精准但贵。]]></description><category></category></item><item><title><![CDATA[C++ 重载、隐藏、覆盖]]></title><link>https://blog.csdn.net/doubleintfloat/article/details/158542180</link><guid>https://blog.csdn.net/doubleintfloat/article/details/158542180</guid><author>doubleintfloat</author><pubDate>Sun, 01 Mar 2026 18:35:31 +0800</pubDate><description><![CDATA[本文通过C++代码示例深入解析了重载(Overload)、覆盖(Override)和隐藏(Hide)三个核心概念的区别。重载指同一作用域内函数名相同但参数不同的函数，用于实现不同参数调用；覆盖是子类对父类虚函数的重写，需完全一致签名，实现多态；隐藏则是子类同名函数遮蔽父类函数，无论参数或虚函数与否。文章详细分析了代码案例，对比了三者的适用场景、绑定方式和调用规则，并提供了解除隐藏的方法。最后通过完整代码演示了三种机制的实际应用场景。]]></description><category></category></item><item><title><![CDATA[sensor banding ,fliker现象，以及如何避免]]></title><link>https://blog.csdn.net/doubleintfloat/article/details/158541983</link><guid>https://blog.csdn.net/doubleintfloat/article/details/158541983</guid><author>doubleintfloat</author><pubDate>Sun, 01 Mar 2026 18:13:19 +0800</pubDate><description><![CDATA[摘要：Banding（条纹）和Flicker（闪烁）是拍摄视频时常见的干扰现象，Banding表现为帧内横向明暗条纹，Flicker则是帧间整体或条纹滚动闪烁。二者均源于卷帘快门与工频/PWM光源频闪的相互作用。最有效的解决方法是调整曝光时间为光源能量周期的整数倍（如50Hz下用1/100s），并同步帧率（如50Hz匹配25/50fps）。此外，硬件优化（电源滤波、信号隔离）和场景调整（使用无频闪光源）也能显著改善问题。设备开启抗闪烁功能（Anti-flicker）可自动适配参数，快速消除干扰。]]></description><category></category></item><item><title><![CDATA[深入了解迭代器erase()之后的失效逻辑]]></title><link>https://blog.csdn.net/doubleintfloat/article/details/158005277</link><guid>https://blog.csdn.net/doubleintfloat/article/details/158005277</guid><author>doubleintfloat</author><pubDate>Thu, 12 Feb 2026 11:30:23 +0800</pubDate><description><![CDATA[摘要：C++中vector的erase操作会导致迭代器失效，对失效迭代器进行++操作会立即触发未定义行为。通过内存地址分析可以看出，erase后原迭代器变为野指针，在for循环头执行++it时直接崩溃。正确做法是在循环体内处理迭代器更新：当元素被erase时，使用erase返回的新迭代器；否则才执行++it。调试模式下会立即检测到失效迭代器并终止程序，这反映了迭代器失效是内存层面的非法操作而非逻辑错误。]]></description><category></category></item><item><title><![CDATA[C++最小惊讶原则]]></title><link>https://blog.csdn.net/doubleintfloat/article/details/157970534</link><guid>https://blog.csdn.net/doubleintfloat/article/details/157970534</guid><author>doubleintfloat</author><pubDate>Wed, 11 Feb 2026 10:10:38 +0800</pubDate><description><![CDATA[摘要： “最小惊讶原则”强调设计代码时应符合用户直觉，避免反常识行为。C++中符合该原则的例子包括基础语法（如&amp;取地址）、类的默认构造/析构、容器操作（如vector::push_back）；反例则有无符号溢出、迭代器失效、string[]越界等。开发者应通过清晰命名、合理运算符重载、避免隐式转换来遵循此原则，使代码“一看就懂，一用就对”，而非依赖特殊规则。该原则既是语言设计准则，也是编码最佳实践。]]></description><category></category></item></channel></rss>