无名猿
码龄9年
求更新 关注
提问 私信
  • 博客:45,933
    45,933
    总访问量
  • 55
    原创
  • 37
    粉丝
  • 42
    关注
IP属地以运营商信息为准,境内显示到省(区、市),境外显示到国家(地区)
IP 属地:广东省
加入CSDN时间: 2017-04-09
博客简介:

weixin_38244193的博客

查看详细资料
个人成就
  • 获得188次点赞
  • 内容获得6次评论
  • 获得378次收藏
  • 代码片获得124次分享
  • 博客总排名25,785名
  • 原力等级
    原力等级
    3
    原力分
    164
    本月获得
    60
创作历程
  • 32篇
    2026年
  • 7篇
    2024年
  • 5篇
    2022年
  • 4篇
    2021年
  • 7篇
    2020年
  • 1篇
    2018年
成就勋章
TA的专栏
  • C++
    40篇
  • windows实用工具
    2篇
  • BAT
    3篇
  • Utils
    2篇
  • Camera Log
  • Camera Performance
    1篇
  • QT
    1篇
  • Excel
    1篇
  • Android memory
    1篇
  • shell
    1篇

TA关注的专栏 7

TA关注的收藏夹 0

TA关注的社区 1

TA参与的活动 0

兴趣领域 设置
  • 数据结构与算法
    数据结构
创作活动更多

【多重好礼】鸿蒙心迹 · 开发录原创征稿活动

鸿蒙开发者的实战经验,值得被记录。从踩坑排查到项目复盘,从工具脚本到学习笔记,每一段真实的开发经历,都是社区最宝贵的技术资产。「鸿蒙心迹 · 开发录」正式启航,不限主题、随时可写,只要是鸿蒙开发相关的真实经验都欢迎投稿。 本活动为 [HarmonyOS 7.0 创新内容共创季](https://builderx.csdn.net/activity-site/harmonyos/activity2026)双轨征文之一,与[「共创季 · 稿事节」](https://harmonyosdev.csdn.net/6a97f0de2b83d06f0ecadec5.html)深度征文互补——「稿事节」写深度技术长文,「开发录」写日常开发实战笔记。 「开发录」每月一期,12月截止,本季共三期,投稿即有机会获得京东卡、CSDN博客流量券、亿万Token、社区定制周边好礼!

126人参与 去参加
  • 最近
  • 文章
  • 专栏
  • 代码仓
  • 资源
  • 收藏
  • 关注/订阅/互动
更多
  • 最近

  • 文章

  • 专栏

  • 代码仓

  • 资源

  • 收藏

  • 关注/订阅/互动

  • 社区

  • 帖子

  • 问答

  • 课程

  • 视频

搜索 取消

对象存储期全解:automatic / static / dynamic / thread

C++ 中变量的销毁时机由存储期决定,而非作用域。四种存储期——自动(栈)、静态(全局/局部静态)、动态(堆)、线程局部(TLS)——分别对应不同的生命周期:自动对象随作用域结束析构;静态对象在程序启动前构造、退出时析构,局部静态仅首次访问时构造一次;动态对象需手动或智能指针管理释放;线程局部对象则在本线程结束时析构。通过构造/析构输出可清晰验证其行为,理解存储期是掌握资源管理与并发安全的关键。
原创
博文更新于 5 小时前 ·
53 阅读 ·
1 点赞 ·
0 评论 ·
3 收藏

可变参数模板与 C++17 折叠表达式:从递归展开到一行求和

本文对比了C++11递归与C++17折叠表达式实现可变参数函数的差异。递归需定义基准情形与递归步,代码冗长且有拷贝开销;折叠表达式则通过四种形式(一元/二元左/右折叠)直接展开参数包,无需递归,语法简洁,支持+、&&等运算符,求值顺序由括号方向决定,空包时行为依运算符而定。折叠表达式显著简化了参数处理逻辑,是现代C++更优选择。
原创
博文更新于 5 小时前 ·
71 阅读 ·
2 点赞 ·
0 评论 ·
1 收藏

左值引用、右值引用与万能引用:引用折叠全解

本文深入解析C++引用折叠与万能引用机制,揭示T&&在类型推导中实现“完美转发”的原理。通过实测证明:具名右值引用变量本身是左值,需用std::forward保留值类别。引用折叠规则(如int& && → int&)决定了左值/右值的最终绑定,而std::forward正是利用该机制实现值类别保持。文中还指出完美转发的陷阱——大括号初始化无法推导类型,导致转发失败。
原创
博文更新于 5 小时前 ·
90 阅读 ·
1 点赞 ·
0 评论 ·
3 收藏

deque 与容器适配器全解:stack、queue、priority_queue 到底套了什么

std::deque用「固定大小缓冲块 + 中控数组」的分段连续内存换来两端 O(1)(实测:头部插入 1000 次,vector 搬 500499 次元素,deque 搬 0 次),代价是多一次下标间接、没有data()、对象固定 80 字节,且两端增删会让所有迭代器失效(但引用依然有效);stackqueue是在容器上削掉接口的适配器,默认底层分别是dequedequevector——stack选 deque 是为了躲开 vector 扩容时的 O(n) 搬迁和只增不减的capacityqueue。
原创
博文更新于 7 小时前 ·
32 阅读 ·
1 点赞 ·
0 评论 ·
2 收藏

std::variant 完全指南:类型安全的 union 与 std::visit 用法

是「带索引的 union」:读错类型抛而不是 UB,切换 alternative 时自动析构旧的、构造新的,代价约等于最大成员的sizeof加一个索引;访问优先用std::visitOverloaded(漏写分支编译期就报错),需要无异常或只关心个别类型时用get_ifget<T>适合已知类型;重复类型只能按下标取,默认构造取第一个类型;类型集合编译期已知就用它,只有类型真到运行时才确定时才用std::any。
原创
博文更新于 7 小时前 ·
42 阅读 ·
0 点赞 ·
0 评论 ·
2 收藏

类型擦除:手写 any 与 function 的原理

本文手写 std::any 与 std::function,揭示其底层共用类型擦除机制:通过非模板接口、模板派生壳与虚函数跳板,将任意类型或可调用对象封装为统一接口。any 用 typeid 校验取值类型,function 以 call() 虚函数作为调用跳板,均实现运行时多态而避免模板膨胀,直观展现标准库如何“藏类型、统接口”。
原创
博文更新于 昨天 08:52 ·
206 阅读 ·
5 点赞 ·
0 评论 ·
4 收藏

函数指针、仿函数、lambda、std::function 四方对比与选型

本文对比C++中四种回调机制:函数指针、仿函数、lambda与std::function,从大小、状态携带、内联性、容器存储等维度实测分析。核心结论:无捕获lambda最小(1字节),std::function固定32字节且唯一支持跨类型容器存储;函数指针无法携带状态,易引发线程安全问题;仿函数与lambda可封装状态,推荐优先使用。决策树明确:需状态用lambda/仿函数,需统一容器存取用std::function,追求性能选无捕获lambda。
原创
博文更新于 昨天 08:52 ·
254 阅读 ·
2 点赞 ·
0 评论 ·
4 收藏

C++ lambda 表达式完全指南:从语法糖到编译器生成的闭包类型

lambda 是编译器为每个表达式生成的匿名类,其 operator() 实现函数逻辑。它本质是对象,非函数或 std::function。无捕获时可转函数指针,类型唯一且大小仅1字节(空类),捕获变量则按值/引用成为数据成员,导致大小增加。相比 std::function 的32字节固定开销及可能堆分配,lambda 更高效。理解闭包类型机制,可自然推导出其性能优势与使用限制。
原创
博文更新于 昨天 08:51 ·
259 阅读 ·
3 点赞 ·
0 评论 ·
4 收藏

noexcept 为什么移动构造必须标:从 vector 扩容退化成拷贝说起

noexcept 不仅是语法糖,更直接影响性能。std::vector 扩容时使用 std::move_if_noexcept,若移动构造未标 noexcept,则退化为深拷贝,导致性能暴跌。noexcept 实际承诺“不抛异常”,否则触发 std::terminate。析构默认 noexcept,移动构造也应谨慎标注。正确使用 noexcept 可让容器高效搬移指针,避免无谓拷贝。
原创
博文更新于 昨天 07:05 ·
298 阅读 ·
2 点赞 ·
0 评论 ·
5 收藏

C++ lambda 捕获列表详解:值捕获、引用捕获、初始化捕获与悬垂引用

本文深入剖析C++ lambda捕获列表的三大核心问题:生命周期管理、闭包大小与值/引用语义。通过真实代码输出,揭示[&]引用捕获导致悬垂指针的高危场景,强调“闭包活过变量生命周期必须用值捕获”的原则。对比值捕获(快照、安全、可跨作用域)与引用捕获(实时值、共享状态、易悬垂)的差异,指出其内存开销与访问性能的权衡。最终提出三条铁律:显式逐个捕获、逃出作用域必用值捕获、大对象慎用直接值捕获——从根本上杜绝闭包陷阱。
原创
博文更新于 昨天 07:04 ·
252 阅读 ·
2 点赞 ·
0 评论 ·
7 收藏

C++17 核心新特性总览:一张速查表 + 8 个上手示例

C++17 通过结构化绑定、if 初始化语句、std::optional 等特性,显著缩短代码、提升安全性。结构化绑定实现零拷贝拆解,if (auto it = m.find(k); ...) 限制作用域,std::optional 替代哨兵值,std::filesystem 实现跨平台路径操作。本文以速查形式详解核心特性,每项含一句话作用、最小示例与使用场景,指引深入学习路径。
原创
博文更新于 前天 08:29 ·
229 阅读 ·
1 点赞 ·
0 评论 ·
5 收藏

RVO 与 NRVO:为什么 return std::move(x) 是反优化

在C++中,return std::move(x);常被误认为优化,实则可能更慢。因C++17起,返回纯右值(如return T{};)或具名局部变量(return x;)时,编译器可强制省略拷贝/移动构造(RVO/NRVO)。显式使用std::move会破坏NRVO,迫使编译器执行一次移动,反而降低性能。实测表明,return x;零开销,而return std::move(x);多出一次移动。正确做法是依赖编译器优化,避免手动move。
原创
博文更新于 前天 08:29 ·
252 阅读 ·
1 点赞 ·
0 评论 ·
2 收藏

std::forward 到底转发的是什么:完美转发与四类转发失败

std::forward<T>(arg) 恢复的是实参的原始值类别:左值传入则返回左值,右值传入则返回右值。其核心依赖类型推导与引用折叠——万能引用 T&& 接收实参后,T 的推导结果保留了值类别信息,forward 通过 static_cast<T&&> 还原该类别。若忽略 forward,具名变量 x 均为左值,导致本应移动的变为拷贝,性能受损。手写 my_forward 验证原理,四类转发失败中尤以“忘记 forward 导致右值退化为拷贝”最隐蔽且代价高昂。
原创
博文更新于 前天 08:28 ·
296 阅读 ·
2 点赞 ·
0 评论 ·
12 收藏

static 的五种含义:同一个关键字,五种不同的事

本文详解 C++ 中 static 的五种用法:函数内局部静态变量(改存储期,跨调用存活)、全局静态变量(改链接,仅本文件可见)、类静态成员变量(所有对象共享)、静态成员函数(无 this,可作回调),以及 C++17 起支持的类内 inline static constexpr 常量。核心在于:static 统一改变存储期(静态)或链接性,本质是作用域与生命周期的分离。附最小可运行示例,助理解其多义性。
原创
博文更新于 前天 00:05 ·
296 阅读 ·
1 点赞 ·
0 评论 ·
12 收藏

四种命名类型转换该用哪个:static/dynamic/const/reinterpret_cast

C++ 中应摒弃 C 风格转换 (T)x,因其隐式选择 const_cast、static_cast、reinterpret_cast 等,意图不明且危险。推荐使用四种命名转换:static_cast 用于编译期安全转换;dynamic_cast 实现运行时多态检查,需虚函数支持;const_cast 唯一可去除 const,但误用会导致未定义行为;reinterpret_cast 进行位级重解释,最危险,易触发严格别名违规。命名转换使类型转换意图清晰、风险可控,提升代码安全性与可维护性。
原创
博文更新于 前天 00:04 ·
258 阅读 ·
3 点赞 ·
0 评论 ·
5 收藏

CTAD 与推导指引:C++17 类模板参数推导怎么用、哪里会踩坑

C++17的CTAD允许省略模板参数,如std::vector names{"a", "b"},由编译器推导类型。其原理是将构造函数转化为推导指引。隐式指引由编译器自动生成,适用于参数可直接推导的情况;用户定义指引则用于覆盖默认行为或解决推导失败问题,语法为template(...) -> Class<T>。合理使用可提升代码简洁性与安全性,但需注意推导歧义风险。
原创
博文更新于 2026.09.25 ·
339 阅读 ·
4 点赞 ·
0 评论 ·
11 收藏

C++ map 与 unordered_map 怎么选:底层结构、复杂度与决策流程

在工程选型中,std::map(红黑树)与 std::unordered_map(哈希表)的核心差异在于:有序性、性能均摊性与内存开销。若需按 key 有序遍历或范围查询,必选 map;若追求平均 O(1) 插删性能且不依赖顺序,unordered_map 更优。但哈希退化时最坏为 O(n),且节点额外开销小、缓存局部性好,适合大数据量场景。小数据量下 map 反而更高效。关键在于:有序性是 map 的契约,不可替代;哈希顺序是实现细节,不可依赖。
原创
博文更新于 2026.09.25 ·
279 阅读 ·
5 点赞 ·
0 评论 ·
8 收藏

inline 的真面目:从函数内联到 C++17 inline 变量

「inline」并非性能开关,而是链接器的“允许重复定义”许可。它不保证内联,真正决定内联的是优化级别与编译器策略。现代 C++ 中,inline 主要用于解决头文件中变量或静态成员的多重定义问题,支持类内定义、多翻译单元共享,提升代码简洁性与可维护性。滥用 inline 反会增加代码体积,影响缓存效率。正确使用应基于实际需求,而非迷信“加 inline 就快”。
原创
博文更新于 2026.09.25 ·
292 阅读 ·
3 点赞 ·
0 评论 ·
8 收藏

if constexpr:C++17 编译期分支,为什么它能取代 SFINAE

C++17的if constexpr解决了模板中类型分支处理的难题:它允许在函数体内根据编译期条件选择执行路径,且未被选中的分支不会被实例化,从而避免了SFINAE的复杂重载与enable_if的冗长签名。其核心优势在于“条件为常量表达式”且“丢弃分支不参与类型检查”,使代码更简洁、可读性更强。但需注意,被丢弃分支仍需语法合法,且同一实例化中所有可能返回的return语句必须类型一致。它虽不能替代预处理器,却极大简化了类型特化逻辑,是现代C++泛型编程的重要利器。
原创
博文更新于 2026.09.25 ·
347 阅读 ·
3 点赞 ·
0 评论 ·
9 收藏

C++ erase-remove 惯用法:为什么 remove 不删元素

std::remove 不删元素,仅移动符合条件的值至前部,并返回新结尾迭代器。其本质是算法层面的“逻辑删除”,需配合容器的 erase 才能真正释放内存。误解此机制会导致残留数据或逻辑错误。正确用法为:v.erase(std::remove(v.begin(), v.end(), value), v.end()),实现“移除-删除”两步分离,体现算法与容器职责分明的设计哲学。
原创
博文更新于 2026.09.25 ·
359 阅读 ·
3 点赞 ·
0 评论 ·
8 收藏
加载更多