C++学习
文章平均质量分 70
在训练营期间的c++学习
Ricky_Theseus
一个普通人类
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
死锁与锁的高级话题
死锁与锁的高级机制摘要 核心要点 死锁四条件: 互斥(无法破坏) 持有并等待(破坏方法:std::lock一次性申请) 不可剥夺(破坏方法:try_lock+回退) 循环等待(破坏方法:固定锁顺序) 锁类型对比: 读写锁:适合读多写少场景(如缓存),读操作可并发 自旋锁:适合超短临界区(微秒级),避免上下文切换 互斥锁:通用场景,保证公平性但开销较大 同步机制: 禁止用sleep代替同步(无内存屏障和锁释放) C++17的scoped_lock结合了std::lock的防死锁能力和RAII安全性 std::原创 2026-07-08 14:50:06 · 351 阅读 · 0 评论 -
并查集:连通性问题
本文介绍了并查集(Union-Find)这种数据结构及其优化方法。并查集用于解决元素间的连通性问题,支持两种操作:合并(Union)和查找(Find)。文章从最简单的Quick-Find实现开始,分析了其O(n)时间复杂度的不足,进而引入基于树形结构的Quick-Union方法。针对Quick-Union可能退化为链表的问题,提出了路径压缩和按秩合并两种优化策略,将时间复杂度降低至近常数级(α(n))。文章最后给出了一个结合路径压缩和按秩合并的优化模板代码,并举例说明其在求解岛屿数量问题中的应用。原创 2026-07-06 13:02:48 · 492 阅读 · 0 评论 -
数组:最基础的连续内存结构
文章摘要: 数组是连续内存结构,支持O(1)随机访问,类比电影院座位系统。其核心优势在于: 通过起始地址和下标直接计算元素位置 良好的缓存局部性,遍历效率高 动态数组(如std::vector)通过扩容策略实现可变大小 缺点是插入/删除中间元素需要O(n)时间移动数据。典型应用包括: 高频随机访问场景 需要空间局部性的算法 作为更复杂数据结构的基础组件原创 2026-07-06 13:01:04 · 354 阅读 · 0 评论 -
左值右值与移动语义
本文总结了C++中左值右值与移动语义的关键知识点:左值可寻址而右值不可;std::move仅进行类型转换不产生运行时代码;引用折叠规则决定引用类型的最终形式;std::forward实现完美转发;emplace_back直接在容器内存构造对象避免额外拷贝/移动操作。重点内容包括移动构造需标记noexcept以保证容器操作效率,以及万能引用与右值引用的区别。原创 2026-07-05 11:30:44 · 126 阅读 · 0 评论 -
C++ 四种强制类型转换
C++提供了四种强制类型转换操作符,比C语言更安全明确:1) static_cast用于基本类型转换和父子类安全向上转型;2) dynamic_cast用于运行时多态类的向下转型,会进行安全检查;3) const_cast专门用于去除const/volatile限定;4) reinterpret_cast进行底层二进制重新解释,风险最高。这些转换替代了C风格的强制转换,各司其职,使代码意图更清晰且更安全。static_cast编译期完成,dynamic_cast运行时检查,const_cast唯一能修改常量原创 2026-06-25 10:02:21 · 205 阅读 · 0 评论 -
智能指针的理解与使用
智能指针是基于RAII机制的C++内存管理工具,主要包括三种类型:unique_ptr独占所有权,禁止拷贝只能移动;shared_ptr通过引用计数实现共享内存管理;weak_ptr不增加引用计数,用于解决shared_ptr的循环引用问题。使用时应优先选择unique_ptr,共享场景用shared_ptr,存在相互引用时配合weak_ptr,并推荐使用make_shared而非new来创建对象。智能指针能有效防止内存泄漏、野指针等问题,是现代C++推荐的内存管理方式。原创 2026-06-25 10:01:34 · 182 阅读 · 0 评论 -
new / delete 和 malloc / free 区别
cstdlib>原创 2026-05-12 16:42:44 · 69 阅读 · 0 评论 -
指针 & 引用区别
原创 2026-05-12 16:41:39 · 56 阅读 · 0 评论 -
const 和 #define 的区别
const 不会出现这种运算优先级问题。原创 2026-05-11 15:14:40 · 60 阅读 · 0 评论 -
移动语义与完美转发
移动语义:通过右值引用 &&,窃取临时对象资源,替代深拷贝,减少开销;std::move仅将左值强转为右值引用,触发移动。完美转发:模板中用万能引用 T&& + std::forward,利用引用折叠,保留实参原本左值/右值属性,无损转发,保证该移动就移动、该拷贝就拷贝。区别:移动语义是对象资源转移;完美转发是参数类别无损传递,为移动语义提供模板层支持。原创 2026-05-11 15:13:41 · 591 阅读 · 0 评论 -
inline 函数与宏(#define)的核心区别
宏是文本替换,inline 是真正函数。宏无类型检查,inline有严格类型检查。宏容易出 bug(优先级、副作用),inline安全可靠。宏不能调试、不能递归,inline可以调试、可以递归。C++ 中优先用 inline,绝对不要用宏定义函数。原创 2026-05-08 17:42:08 · 228 阅读 · 0 评论 -
C++右值引用
移动语义通过右值引用实现资源的高效转移。当对象持有动态内存或文件句柄等资源时,移动构造函数或移动赋值运算符可以直接“窃取”资源,而非深拷贝。,否则某些标准库操作会回退到拷贝。避免返回局部变量的右值引用,会导致悬垂引用。右值引用的核心目标是支持移动语义和完美转发。右值引用是C++11引入的重要特性,用于标识临时对象或即将被销毁的对象。移动操作后将源对象置于有效但未定义状态,符合RAII原则。右值引用允许高效转移资源所有权,避免不必要的拷贝操作。的类型决定转发为左值或右值引用。只能绑定到左值,而右值引用。原创 2026-04-11 21:08:32 · 74 阅读 · 0 评论 -
C++静态库
静态库的作用是什么呢?可以想象这样一个场景,如果你开发了一个工具库,有公司想要使用你的库,如果直接把cpp和h文件发给别人,别人拿到源码编译后可以直接一脚把你踹了。但是如果只提供.h和静态库文件,别人是看不到源码的,这样你就可以收取维护和使用的费用。文件形式存在,其核心作用是将一组预编译的代码(函数、类等)打包,供其他程序直接链接使用。确保主程序与库的编译环境(如运行时库类型MT/MD)一致,直接构建即可。静态库(Static Library)在Windows环境下通常以。)声明接口,源文件(原创 2026-04-10 11:51:31 · 346 阅读 · 0 评论 -
静态链接与动态链接
不管静态还是动态,“链接”的本质就一件事:把你写的代码(.cpp)和别人写好的库代码(比如Qt库、数学库、自定义库),“拼接”成一个能运行的可执行文件(.exe/.out)。你写的代码是“主体”,库代码是“工具”,链接就是把“工具”整合到“主体”里,让程序能正常调用工具的功能(比如printf、QWidget::show())。这个“工具”是直接装进主体里,还是放在外面,用的时候再找。优点很明显:部署极简:单文件分发,不用管依赖,适合离线工具、嵌入式设备(比如单片机程序),移植性极强。原创 2026-04-10 11:50:34 · 1077 阅读 · 0 评论 -
C++ 动态库与静态库的区别
静态库其实是编译目标文件的集合,也就是本质上和.obj文件没有太大区别,因此静态库是不可执行的。动态库则是obj文件经过链接生成的可执行文件,也就是说dll本身其实也是可以执行的,但是我们一般把直接用于执行的生成为exe,把用于别的程序调用的生成为dll。静态库在编译时被完整地链接到可执行文件中,生成的文件独立运行,不依赖外部库文件。常见的静态库格式在 Windows 上是。静态库生成的可执行文件无需额外依赖,动态库需要随主程序分发或确保目标系统已安装。静态库在编译阶段链接,动态库在运行时链接。原创 2026-04-09 23:06:34 · 254 阅读 · 0 评论 -
C++编译全流程
C++代码从源代码到可执行文件的转换涉及多个阶段,包括预处理、编译、汇编和链接。每个阶段都有特定的任务,最终生成可在目标平台上运行的程序。原创 2026-04-09 14:29:58 · 337 阅读 · 0 评论 -
C++ 高频面试题
原创 2026-04-08 10:40:50 · 219 阅读 · 0 评论 -
C++全局变量、局部变量、静态全局变量、静态局部变量的区别
作用域:全局变量跨文件(需extern),静态全局变量仅限文件;局部变量限函数/代码块,静态局部变量限函数但保持值。存储区域:全局、静态全局和静态局部变量在全局数据区;局部变量在栈区。生命周期:全局、静态全局和静态局部变量为整个程序运行期;局部变量随函数调用结束。初始化:未初始化的全局、静态全局和静态局部变量默认为0;局部变量值随机。原创 2026-03-31 11:00:53 · 287 阅读 · 0 评论 -
C++虚函数
核心:在基类里,用virtual关键字声明的成员函数,允许子类重新写这个函数的实现。当我们用基类的指针或者引用,去调用这个函数时,不会固定执行基类的版本,而是看这个指针/引用实际指向的是哪个子类的对象,就执行哪个子类的函数版本——这就是“动态多态”。通俗类比:比如定义一个“交通工具”基类,里面有一个“运行”函数;再定义“汽车”和“飞机”两个子类,分别重新写“运行”函数(汽车是公路跑,飞机是天上飞)。原创 2026-03-15 11:24:15 · 492 阅读 · 0 评论
分享